Ich versuche, einen Dienst zu erstellen, Exchange-Benachrichtigungen zu asp.net-Anwendungen zu schieben, schließlich SignalR verwenden.EWS Notification Hub für mehrere Benutzer
Mein Plan ist es, einen Benachrichtigungs-Hub zu erstellen, der jeden Benutzer bei der Anmeldung bei der ASP-Anwendung abonniert und auf Benachrichtigungen für sie wartet. Wenn eine Benachrichtigung empfangen wird, soll der zweite Teil des Projekts dann signalR verwenden, um nur die korrekten Benachrichtigungen an jeden Benutzer zu senden. Sobald sie sich abgemeldet haben oder eine Zeitüberschreitung haben, wird der Benachrichtigungs-Hub sie abbestellen.
Bisher habe ich ein wenig grundlegende Tests gemacht und kann Benachrichtigungen in einer kleinen Konsole App für mich mit meinen Anmeldeinformationen hart codiert erhalten. Womit ich kämpfe ist, wie man das für mehrere Menschen gleichzeitig macht. Zum Beispiel müsste ich für jeden Benutzer separate Threads erstellen oder gibt es einen besseren Weg?
Ich denke, unabhängig davon werde ich Identitätswechsel verwenden, anstatt die Berechtigungen jedes Benutzers richtig zu halten? Ich werde auch eine Möglichkeit finden, das Timeout für jeden Benutzer automatisch zu aktualisieren, wenn sie eine aktive Sitzung haben.
Unten ist ein kleiner Code, den ich gefunden habe und mit dem ich gespielt habe. Ich wäre dankbar für irgendwelche Ideen oder Beispiele, die jeder teilen könnte, wie ich das am besten erreichen könnte.
Vielen Dank
Andy
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 + "-------------");
}
}
}
Danke das ist großartig! Kannst du ein wenig ausarbeiten ...So bekomme ich den Identitätswechsel-Plan auf die Art und Weise, wie Sie die Anmeldeinformationen für das "Anwendungskonto" fest codieren und das E-Mail-Konto weitergeben, das Sie sich ausgeben. Wie gehen Sie mit der Erstellung der 2., 3., 100. Verbindung um? Werden alle Abonnements als Teil von 1 Verbindung beendet? Vielen Dank, Andy – mcinnes01
ja du hast es richtig gemacht, alle Abos gehen auf die selbe Verbindung, ich habe die Antwort modifiziert und Teile meines Codes eingefügt. Ich habe den Code der Verbindungen nicht angegeben, weil es hässlich ist: D ich habe jedenfalls beschrieben, wie ich darüber dachte. WARNUNG, ich weiß nicht, ob dies der empfohlene Weg ist oder wie sicher es ist, aber zumindest funktioniert es und erledigt die Arbeit. – BraveHeart
Danke BraveHeart, das ist großartig. Ich muss ein Identitätswechsel-Konto einrichten, also werde ich es versuchen und es Ihnen mitteilen, sobald ich es getan habe. – mcinnes01