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 – 如何使用resxresourcewriter写入所有三个值?
- .net – ReportViewer 2010无法评估表达式
- ASP.NET 2.0 JQuery AJAX登录
- 我可以使用ASP.NET成员身份实体框架吗?
- asp.net – Silverlight初始化错误2110 Internet Explorer
- 隐藏ASP.NET菜单项
- asp.net-mvc-3 – 方法“OrderBy”必须在方法“跳过”异常之
- asp.net – $(“#dialog”).parent().appendTo($(“form:f
- asp.net-mvc – 为什么在ASP.NET MVC中使用lambdas而不是反
- asp.net-mvc – ASP.NET MVC检查Controller或Action中的自定