3 Stimmen

Behebung von Blockierproblemen beim gleichzeitigen Aufruf mehrerer Methoden eines WCF-Dienstes aus Silverlight

Ich habe gerade diesen interessanten Artikel über den gleichzeitigen Aufruf mehrerer Methoden auf einem WCF-Dienst von Silverlight aus gelesen:

http://weblogs.asp.net/olakarlsson/archive/2010/05/20/simultaneously-calling-multiple-methods-on-a-wcf-service-from-silverlight.aspx

In dem Artikel heißt es: "Es hat sich herausgestellt, dass das Problem in einer Mischung aus Silverlight, Asp.Net und WCF begründet ist, nämlich wenn man mehrere Aufrufe an eine einzeln WCF-Webdienstes und Sie haben Asp.Net-Sitzungsstatus aktiviert, werden die Aufrufe vom Dienst sequenziell ausgeführt, daher werden alle lang laufenden Aufrufe die nachfolgenden blockieren."

Ich nehme an, dass das Blockieren nur ein Problem ist, wenn Sie mehrere Aufrufe an die dieselbe Dienst, und dass zwei gleichzeitige Aufrufe von zwei verschiedenen Methoden auf zwei verschiedenen Diensten nicht dazu führen sollten, dass der eine den anderen blockiert?

Die vorgeschlagene Lösung für das Problem in SL3 beinhaltet die Verwendung der folgenden Syntax in der Methode Application_Startup:

WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);

Der Sitzungsstatus muss dann bei WCF-Aufrufen aufrechterhalten werden, indem ein Cookie-Container eingerichtet wird, der von allen Proxies gemeinsam genutzt wird (siehe http://forums.silverlight.net/forums/p/174322/393032.aspx )

Ist dies immer noch die empfohlene Lösung in Silverlight 4? Hat jemand einen alternativen Ansatz verwendet?

3voto

piers7 Punkte 3884

Wenn Sie eine ASP.Net-Anwendung aufrufen und Sitzungscookies verwenden, dann tous die Aufrufe in die Anwendung werden serialisiert (abgesehen von denen, bei denen die Seite explizit aus dem Sitzungsstatus aussteigt).

Normalerweise ist dies kein großes Problem, da ein Client-Browser in der Regel auf eine ASP.Net-Seite und eine Reihe von Ressourcen (Bilder, Js, CSS usw.) zugreift, und diese letzteren nicht auf ASP.Net abgebildet sind so dass IIS sie nativ bereitstellt. Wenn Sie jedoch versuchen, zwei ASP.Net-Seiten gleichzeitig aufzurufen (z. B. in einem Frameset), werden sie nacheinander geladen.

Jetzt habe ich keine wissen dass dies mit WCF geschieht, aber basierend auf dem, was Sie sagen, wenn Sie dieses Verhalten für einen Dienst sehen, würde ich erwarten, dass für alle von ihnen zu sehen, weil die Sitzung pro Benutzer, nicht pro Dienst ist.

In ASP.Net können Sie den Sitzungsstatus seitenweise deaktivieren. Wenn dies für einen gehosteten WCF-Dienst möglich und für Ihr Szenario praktikabel ist (um die Dienste zustandslos zu machen), würde dies das Problem beheben. Oder verschieben Sie einen oder mehrere Dienste in eine andere ASP.Net-Anwendung (andere Sitzung).

Denken Sie daran, dass es hier noch andere Probleme gibt, die mit den Instanzierungs- und Wiederverfügbarkeitsmodellen des Dienstes zu tun haben. Ihr oben beschriebenes Problem ist ein Gleichzeitigkeitsproblem pro Benutzer, aber es gibt noch andere. Wenn Sie zum Beispiel den Dienst als Singleton (InstanceContextMode.Single) und nicht reentrant (ConcurrencyMode.Single) einrichten, dann es wird immer nur eine Anfrage auf einmal bearbeitet für alle Benutzer.

更新情報 : Ich lese gerade einige Dokus:

  • WCF-Dienste werden nicht in ASP.Net-Sitzungen eingeschrieben, es sei denn, Sie bitten darum (mit )
  • WCF-Dienste können auf einer pro Dienstleistung Basis-Opt-In, unter Verwendung des Attributs [AspNetCompatibilityRequirements] für die Dienstimplementierung
  • Es scheint keine Möglichkeit zu geben, sich für die Teilnahme an der Sitzung zu entscheiden, aber nicht für die Teilnahme am Sitzungsstaat.

Es gibt einen guten Blog-Beitrag zu diesem Thema auf Website von Wenlong Dong

Soweit ich sehen kann, sollten Sie AspNetCompatibilityRequirementsMode.NotAllowed verwenden können, um einzelne Dienste vollständig von ASP.Net-Diensten auszuschließen. Alternativ lassen Sie es standardmäßig deaktiviert und nur diejenigen, die Zugriff auf die ASP.Net-Sitzung benötigen (unter Berücksichtigung, dass, es sei denn, Sie wirklich brauchen, um die gleiche Sitzung mit ASP.Net zu teilen, nur mit WCF-Sitzungsdienste ist wahrscheinlich eine bessere Wette) opt-in.

3voto

Cine Punkte 3977

In .NET 4 können Sie dies in Application_BeginRequest

if (Context.Request.Path.EndsWith("xxx.svc"))
   Context.SetSessionStateBehavior(SessionStateBehavior.Disabled);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X