Я пытаюсь создать службу для обмена уведомлениями об обмене в приложениях asp.net, в конечном итоге используя SignalR.EWS Notification Hub для нескольких пользователей
Мой план заключается в создании центра уведомлений, который подписывается на каждого пользователя при входе в приложение 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("\n\nPress 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 + "-------------");
}
}
}
Спасибо, что здорово! Можете ли вы немного разобраться ...Поэтому я получаю план олицетворения таким образом, что вы жестко скопируете учетные данные учетной записи приложения и передаете учетную запись электронной почты, которую вы выдаете. Как вы занимаетесь созданием второго, третьего, 100-го соединения? Сделайте все подписки каким-то образом, как часть 1 соединения? Большое спасибо, Andy – mcinnes01
да, вы поняли, все подписки идут в одно и то же соединение, я изменил ответ и поместил части своего кода. Я не установил код соединений, потому что он уродлив: D в любом случае я описал, как я думал об этом. ПРЕДУПРЕЖДЕНИЕ. Я не знаю, является ли это рекомендуемым способом или насколько он безопасен, но, по крайней мере, он работает и выполняет свою работу. – BraveHeart
Спасибо BraveHeart, это здорово, мне нужно настроить учетную запись олицетворения, поэтому я пойду и дам вам знать, как только у меня получится. – mcinnes01