Frage

Ich muss einen WCF -Dienst erstellen, der in IIS gehostet wird, den HTTP -Transport verwendet und Status im Speicher des Servers halten. Ich bin mir bewusst, dass staatliche Dienste keine gute Idee sind, aber diese letzte Einschränkung ist notwendig, damit der Service mit einem älteren Kunden funktioniert.

Mein erster Gedanke war die Sitzung von ASP.NET, um die Werte zu speichern. Ich habe den ASP.NET -Kompatibilitätsmodus in meinem Dienst aktiviert, der mir Zugriff auf den HTTPContext gab, aber Werte, die im Sitzungsobjekt platziert wurden, wurden nicht im Speicher bestehen. Ich gehe davon aus, dass dies daran lag, dass das HTTP -Modul, das den Sitzungszustand übernimmt, nicht korrekt konfiguriert war. Beim Googeln nach der Antwort stieß ich auf WCF -Sitzungen und dachte, es könnte eine bessere Idee sein, sie zu verwenden.

WCF-Sitzungen scheinen jedoch das Unter-Dokument zu sein und platzieren einen seltsamen Satz von Voraussetzungen für einen Dienst, und ich konnte keine Konfiguration finden, die zu meinen Anforderungen entspricht: muss in IIS gehostet werden, muss HTTP- oder HTTPS-Transport verwenden und können Die Antwort auf die Windows -Authentifizierung, da der Client und der Server nicht Teil derselben Domäne sind. Ich versuche, dies mit dem WSHTTPBinding in Gang zu bringen. Ich hatte gehört, dass WCF -Sitzungen entweder Sicherheit oder zuverlässige Nachricht erforderlich sind wurde nicht durch die Ausnahme des Dienstes authentifiziert. Dies ist ziemlich logisch, da es Windows Security verwendet hat.

  • Wenn ich die Sicherheit deaktiviere, schlägt er mit einem „Vertrag eine Sitzung vor, aber Binding 'WshttpBinding' unterstützt ihn nicht oder ist nicht ordnungsgemäß konfiguriert, um es zu unterstützen.“

  • Wenn ich beim Deaktivieren der Sicherheitsbehinderung eine zuverlässige Nachricht aktiviere, erhalte ich die Ausnahme „Bindungsvalidierung fehlgeschlagen, da die WSHTTPBINDING nicht zuverlässige Sitzungen über Transportsicherheit (HTTPS) unterstützt. Der Channel Factory oder Service Host konnte nicht geöffnet werden. Verwenden Sie die Nachrichtensicherheit für sichere zuverlässige Nachrichten über HTTP. “

  • Ich habe versucht, die Sicherheit der Transportebene zu aktivieren, aber dies scheint keinen Unterschied zu dem generierten Fehler zu machen

Gibt es eine Konfiguration, die für mich funktioniert? Oder sollte ich einfach zum Plan zurückkehren, ASP.NET -Sitzungen zu verwenden?

War es hilfreich?

Lösung

Sie können WCF -Sitzungsinformationen auf eine ziemlich einfache Weise im Speicher halten. Um mögliche externe Einflüsse in meinen Anweisungen zu beseitigen, gehe ich davon aus, dass Sie mit einem brandneuen Projekt beginnen:

  1. Erstellen Sie ein neues WCF Service Library -Projekt. Dieses Projekt wird bereits einen Service mit a enthalten WSHttpBiding Bindung vorkonfiguriert.
  2. Gehen Sie zum Servicevertrag (iService1.cs) und ändern Sie das ServicEContract -Attribut in Folgendes:

    [ServiceContract(SessionMode = SessionMode.Required)]
    
  3. Gehen Sie zum Service Implimentationation (Service1.cs) und fügen Sie das folgende ServiceBehavior -Attribut zur Serviceklasse hinzu (Service1):

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Single)]
    
  4. Fügen Sie Sitzungsdaten als Mitglieder der Serviceklasse hinzu (Service1):

    public class Service1 : IService1
    {
        ...
    
        private string UserFullName { get; set; }
    
        ...
    }
    
  5. Verwenden Sie die Mitglieder, um Sitzungsdaten zu präsentieren (denken Sie daran, sie auch dem Servicevertrag hinzuzufügen. IService1):

    public class Service1 : IService1
    {
        ...
    
        public string Welcome(string fullName)
        {
            UserFullName = fullName ?? "Guest";
            return string.Format("Welcome back, {0}!", UserFullName);
        }
    
        public string Goodbye()
        {
            return string.Format("Come back soon, {0}!", UserFullName ?? "Guest");
        }
    
        ...
    }
    

SessionMode.Required stellt sicher, dass Ihre Kunden Sitzungsverfolgung sind.
InstanceContextMode.PerSession stellt sicher, dass für jede Sitzung eine Instanz Ihrer Serviceklasse (Service1) erstellt wird, sodass Sie Sitzungsdaten darin aufbewahren können und in derselben Sitzung im Speicher über mehrere Anrufe hinweg vorhanden sind.
ConcurrencyMode.Single stellt sicher, dass nur ein Thread jede Serviceklasseninstanz (Service1) eingeben kann, und verhindert mögliche Probleme mit der Parallelität, wenn Sie nur auf Daten aus der Serviceklasse (und externe Thread-safe-Standorte) zugreifen.

BEARBEITEN: Standardmäßig, WSHttpBinding Ermöglicht nur Sicherheitssitzungen. Es unterstützt aber auch zuverlässige Sitzungen, die es ermöglichen, Sitzungen ohne Sicherheitsfunktion zu erstellen. Die folgende Bindungskonfiguration deaktiviert die Sicherheit und ermöglicht zuverlässige Sitzungen:

<wsHttpBinding>
    <binding name="wsHttpBindingConfiguration">
        <security mode="None" />
        <reliableSession enabled="true" />
    </binding>
</wsHttpBinding>

Andere Tipps

IMO Das passiert, wenn Sie eine Technologie mit einer schlechten Abstraktion über HTTP wie WCF verwenden. Die Tatsache, dass WCF-Webdienste theoretisch ohne HTTP (dh Over Net TCP, MSMQ usw.) gehostet werden können Nach Versuch und Irrtum "Wo Sie jede mögliche Konfigurationspermutation versuchen, bis Sie den richtigen gefunden haben, der funktioniert!

Wenn Sie WCF nicht verwenden konnten und den Webdienst von Grund auf neu implementieren müssten, würden Sie einfach einen Cookie einstellen, wenn der Client erfolgreich authentifizierte. Greifen Sie dann mit jeder Kundenanfrage die Sitzungsinformationen, auf die dieses Cookie verwiesen wird.

Eine mögliche Lösung, wenn Sie WCF verwenden mussten, besteht darin, das Sitzungsmanagement in Ihren eigenen Händen zu nehmen (Es ist das, was ich tue, wenn ich mit den Anstrengungen, die erforderlich sind, um etwas zum Laufen zu bringen, unzufrieden bin.) und haben Sie eine explizite „Sitzungs“ -Fotie für alle Ihre Webdienste, die eine Sitzung/Authentifizierung erfordern (normalerweise eine Richtlinie, die zur Authentifizierung generiert wird). Für jede nachfolgende Anfrage verwenden Sie die GUID, um die mit diesem Client verbundenen Sitzungsinformationen zu rehydrieren.

Wenn Sie verschiedene Webdienst -Frameworks ausprobieren möchten, pflege ich eine Open Source Web Services Framework Auf diese Weise erstellen Sie konfigurationsfreie, trockene, überprüfbare Webdienste, in denen (ohne die erforderliche Konfiguration) jeden von Ihnen erstellten Webdienst automatisch über REST XML, JSON, JSV, SOAP 1.1, SOAP 1.2-Endpunkte zugänglich ist. Tatsächlich können Sie über eine HTTP-URL für ruh-ful-Kunden und einfaches Debuggen sowie Seifenendpunkte (eine beliebte Wahl, die von einigen Unternehmen vorgeschrieben wird) auf denselben Webdienst über eine HTTP-URL-URL zugreifen. Das Hallo Welt Tutorial sollte Ihnen einen guten Überblick über einige seiner Funktionen und die Funktionsweise geben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top