asp.net – 适用于多个用户的EWS通知中心
| 
                         我正在尝试创建一个服务来将交换通知推送到asp.net应用程序,最终使用SignalR. 我的计划是创建一个通知中心,在每个用户登录到asp应用程序时为其预订,并为他们监听通知.当收到通知时,项目的第二部分是使用signalR仅向每个用户发送正确的通知.一旦他们注销或超时,通知中心将取消订阅. 到目前为止,我已经完成了一些基本的测试,并且可以通过我的凭证硬编码在一个小的控制台应用程序中接收通知.我正在努力的是如何同时为多个人这样做.例如,我是否必须为每个用户创建单独的线程,还是有更好的方法? 我想无论我不得不使用模仿而不是持有每个用户的凭据吗?如果每个用户都有活动会话,我还必须找到一种自动刷新超时的方法. 下面是我发现并且一直在玩的一些代码,我将很感激任何想法或任何人可以分享我如何能够最好地实现这一目标的例子. 非常感谢 安迪 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Threading.Tasks;
using Microsoft.Exchange.WebServices.Data;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
                ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP2);
                service.Url = new Uri("https://server/EWS/Exchange.asmx");
                service.Credentials = new NetworkCredential("user","pass","domain");
                SetStreamingNotifications(service); 
                while (true)
                { }
        }
        static void SetStreamingNotifications(ExchangeService service)
        {
            // Subscribe to streaming notifications on the Inbox folder,and listen
            // for "NewMail","Created",and "Deleted" events.
            StreamingSubscription streamingsubscription = service.SubscribeToStreamingNotifications(
                new FolderId[] { WellKnownFolderName.Calendar,WellKnownFolderName.Inbox },EventType.Created,EventType.Modified);
            StreamingSubscriptionConnection connection = new StreamingSubscriptionConnection(service,9);
            connection.AddSubscription(streamingsubscription);
            // Delegate event handlers.
            connection.OnNotificationEvent +=
                new StreamingSubscriptionConnection.NotificationEventDelegate(OnEvent);
            connection.OnSubscriptionError +=
                new StreamingSubscriptionConnection.SubscriptionErrorDelegate(OnError);
            connection.OnDisconnect +=
                new StreamingSubscriptionConnection.SubscriptionErrorDelegate(OnDisconnect);
            connection.Open();
            Console.WriteLine("--------- StreamSubscription event -------");
        }
        static private void OnDisconnect(object sender,SubscriptionErrorEventArgs args)
        {
            // Cast the sender as a StreamingSubscriptionConnection object.          
            StreamingSubscriptionConnection connection = (StreamingSubscriptionConnection)sender;
            // Ask the user if they want to reconnect or close the subscription.
            ConsoleKeyInfo cki;
            Console.WriteLine("The connection to the subscription is disconnected.");
            Console.WriteLine("Do you want to reconnect to the subscription? Y/N");
            while (true)
            {
                cki = Console.ReadKey(true);
                {
                    if (cki.Key == ConsoleKey.Y)
                    {
                        connection.Open();
                        Console.WriteLine("Connection open.");
                        break;
                    }
                    else if (cki.Key == ConsoleKey.N)
                    {
                        // The ReadKey in the Main() consumes the E.
                        Console.WriteLine("nnPress E to exit");
                        break;
                    }
                }
            }
        }
        static void OnEvent(object sender,NotificationEventArgs args)
        {
            StreamingSubscription subscription = args.Subscription;
            // Loop through all item-related events.
            foreach (NotificationEvent notification in args.Events)
            {
                switch (notification.EventType)
                {
                    case EventType.NewMail:
                        Console.WriteLine("n-------------Mail created:-------------");
                        break;
                    case EventType.Created:
                        Console.WriteLine("n-------------Item or folder created:-------------");
                        break;
                    case EventType.Deleted:
                        Console.WriteLine("n-------------Item or folder deleted:-------------");
                        break;
                }
                // Display the notification identifier.
                if (notification is ItemEvent)
                {
                    // The NotificationEvent for an e-mail message is an ItemEvent.
                    ItemEvent itemEvent = (ItemEvent)notification;
                    Console.WriteLine("nItemId: " + itemEvent.ItemId.UniqueId);
                }
                else
                {
                    // The NotificationEvent for a folder is an FolderEvent.
                    //FolderEvent folderEvent = (FolderEvent)notification;
                    //Console.WriteLine("nFolderId: " + folderEvent.FolderId.UniqueId);
                }
            }
        }
        static void OnError(object sender,SubscriptionErrorEventArgs args)
        {
            // Handle error conditions.
            Exception e = args.Exception;
            Console.WriteLine("n-------------Error ---" + e.Message + "-------------");
        }
    }
}
解决方法我解决这个问题的方法是:>拥有一个有权冒充所有用户的帐户. 这是我的代码的两个部分.忘记LogDevice它只是内部的东西. /// <summary>
    /// Impersonate one user at a time and without using the autodiscovery method to find the proper url for the userSmtp,/// and copy the provided url to the usersmtp.
    /// </summary>
    /// <param name="url"> </param>
    /// <param name="userSmtp">user smtp</param>
    /// <param name="enableTrace">to enable logging from the XML tracing </param>
    /// <param name="exchangeVersion">Exchange server version used</param>
    private Uri ImpersonateUser(Uri url,string userSmtp,bool enableTrace,ExchangeVersion exchangeVersion)
    {
        Uri result = url;
        var log = "ImpersonateUser n";
        try
        {
            log += "0/8 Checking services redundancyn";
            if (Services.ContainsKey(userSmtp))
            {
                Services.Remove(userSmtp);
            }
            log += "1/8 Create a new service for " + userSmtp + "n";
            var service = new ExchangeService(exchangeVersion);
            log += "2/8 Get credentials for the servicen";
            var serviceCred = ((System.Net.NetworkCredential)(((WebCredentials)(Services.First().Value.Credentials)).Credentials));
            log += "3/8 Assign credentials to the new servicen";
            service.Credentials = new WebCredentials(serviceCred.UserName,serviceCred.Password);
            log += "4/8 TraceEnabled is" + enableTrace.ToString() + "n";
            service.TraceEnabled = enableTrace;
            log += "5/8 Get the Url for the  service with AutodiscoverUrl n";
            service.Url = url;
            log += "6/8 Assign a new ImpersonatedUserId to the new service for" + userSmtp + "n";
            service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress,userSmtp);
            try
            {
                log += "7/8 Validating the impersonationn";
                RuleCollection rulecoll = service.GetInboxRules();
            }
            catch (Exception ex)
            {
                _logDevice.LogSrvMessage(1,"ExchangeLiteService: ImpersonateUser: failed to validate the impersonation for {0}n Exception: {1}n",userSmtp,ex.Message);
                int hr = System.Runtime.InteropServices.Marshal.GetHRForException(ex);
                if (hr == -2146233088) // We do not have right to impersonate this user.
                {
                    result = null;
                    return result;
                }
                else
                {
                    _logDevice.LogSrvMessage(1,"ExchangeLiteService: ImpersonateUser(2): trying to resolve {0} with Autodiscover instead...",userSmtp);
                    result = ImpersonateUser(userSmtp,enableTrace,exchangeVersion);
                }
            }
            log += "8/8 Adding the service n";
            if (!Services.ContainsKey(userSmtp))
            {
                Services.Add(userSmtp,service);
                _logDevice.LogSrvMessage(1,"ExchangeLiteService: ImpersonateUser(2): {0} has been impersonatedn",service.ImpersonatedUserId.Id);
            }
        }
        catch (Exception ex)
        {
            _logDevice.LogSrvMessage(1,"ExchangeLiteService: ImpersonateUser(2): exception {0}n The exception occured after the following steps: n{1}",ex.Message,log);
        }
        return result;
    } 
                         (编辑:莱芜站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!  | 
                  
- asp.net-mvc – 使用AD的ASP.NET MVC表单Auth在本地工作但在
 - asp.net – 在VS Code中指定localhost端口的位置
 - asp.net-mvc – 如何将ASP.Net MVC路径段中的1或0映射到布尔
 - asp.net-mvc – 你如何指定在列表框中显示多少项目(高度)
 - asp.net-mvc – 如何继承ASP.NET MVC控制器并仅更改视图?
 - 如何在ASP.NET中的GridView中定义CellPadding
 - asp.net – Javascript日期本地化
 - .net – ELMAH对企业库异常处理块
 - asp.net-mvc – DropDownListFor在编辑视图上不重复的项目(
 - 具有多个ASP.NET Web应用程序的Visual Studio解决方案
 
- VS2005(c#)项目调试问题解决方案集锦 转
 - asp.net-mvc – 如何在asp.net中使用mvc构建购物
 - asp.net-mvc-4 – 最小和最大字符串长度的单独错
 - ASP.NET清空缓存时遇到的问题简析
 - ASP.NET成员:拒绝用户阻止CSS,页面无法正确呈现
 - VS 2013 RC中缺少ASP.NET Web窗体脚手架功能
 - asp.net-web-api – 可以从Request对象获取当前的
 - asp.net-mvc – 缩小ASP.NET MVC中的Action Filt
 - asp.net – __doPostBack在DotNetNuke网站上未定
 - asp.net-mvc – ASP.NET MVC:处理取消按钮的正确
 
