Announcement

Collapse
No announcement yet.

Sessions und Webservices

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Sessions und Webservices

    Hallo,

    habe in ASP.NET schon erfolgreich das Sessionmanagement ausprobiert. Jetzt ist das Problem, dass ich auch in einer mehrschichtigen Anwendung ein Session-Management benötige.

    Meine Geschäftslogik (IIS, *.asmx) publiziert die Methoden als Webservice, die dann von ASP.NET und einem WinForm-Client integriert werden können (abgeschaut aktuelles dot.net magazin, .NET gegen J2EE, nur verstehe ich das Sessionmanagement dort einfach nicht). Ich nutze den IIS also für die Webservices und das ASP.NET. Würde ich das Session-Management in ASP.NET benutzen, so ist der WinForm-Client außen vor und auch jede andere Instanz, die direkt auf den Webservice geht.

    Ein Webservice hat doch auch ein ein Session-Objekt, ist das nicht das gleiche wie das von ASP.NET? Ich vermute mal nicht, da es unterschiedliche Instanzen sind ... oder?

    Also, wie muß ich da rangehen?

    Viele Grüße,
    Patrick

  • #2
    Hallo,

    >..so ist der WinForm-Client außen vor ..

    nicht unbedingt - nur beim Forms-Client muss die ASP.NET-Sessionunterstützung explizit angefordert werden. Damit ein Web Service-Client mit den automatischen ASP.NET-Sessions arbeiten kann, muss der <b>CookieContainer</b> bemüht werden.

    Die generierte Proxy-Klasse für den Web Service kann in der Standard-Konfiguration nicht mit Cookies umgehen und unterstützt somit nicht die Zustandsverwaltung des Session-Objekts von ASP.NET, wenn der Web Service diese Fähigkeit mit <b>EnableSession</b> anfordert. Damit das Proxy-Objekt zur Laufzeit mit den Sessions umgehen kann, muss immer dann eine neue Instanz der <b>CookieContainer</b>-Klasse aus dem Namespace System.Net erzeugt und der Eigenschaft <b>CookieContainer</b> zugewiesen werden, wenn diese Eigenschaft noch keine Objektinstanz verwaltet

    Beispiel Web Service

    <pre>

    Imports System.Web.Services

    <WebService(Description:="Session + CookieContainer", Namespace:="http://OSSISOFT.local/")> _
    Public Class OSServiceSession
    Inherits System.Web.Services.WebService
    ...

    Private Const sSessionVarName = "OSCounterData"

    <WebMethod(EnableSession:=True, Description:="Session-Untersützung ist aktiv")> _
    Public Function GetIncCounter() As Integer
    If Me.Session(sSessionVarName) Is Nothing Then
    Me.Session.Add(sSessionVarName, 1)
    Else
    Me.Session(sSessionVarName) = CType(Session(sSessionVarName), Integer) + 1
    End If
    Return CType(Session(sSessionVarName), Integer)
    End Function

    <WebMethod(EnableSession:=True, Description:="Liefert Session.SessionID zurück")> _
    Public Function GetSessionID() As String
    Return Me.Session.SessionID
    End Function

    </pre>

    Beispiel Client:
    <pre>

    Private iCnt As Integer = 1
    Dim aWS As New localhost.OSServiceSession()

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    aWS.Timeout = 5000
    ' Proxy-Objekt soll mit dem vom Web Service gelieferten Cookie hantieren
    If aWS.CookieContainer Is Nothing Then
    aWS.CookieContainer = New System.Net.CookieContainer()
    End If
    ListBox1.Items.Add(String.Format("GetIncCounter: {0}; GetSessionID: {1}", _
    aWS.GetIncCounter, aWS.GetSessionID))
    StatusBar1.Text = String.Format("Web Service zum {0}. Mal aufgerufen", iCnt)
    iCnt += 1
    End Sub

    </pre>

    Ergebnis: Bei jedem Aufruf wird die gleiche Session-ID zurückgeliefert und auch der Wert der Session-Variable zählt sich nun auch in einer Windows-Anwendung hoch.
    &#10

    Comment


    • #3
      Hallo,

      danke erst einmal für die Antwort.

      Grundsätzlich: Auf den Webservice sollen unterschiedliche Clients (Web, WinForm, J2EE, Mobile, ...) zugreifen können. Daher:

      1. Was ist, wenn die Web-Anwendung "Cookieless" läuft? Viele wollen keine Cookies ...

      2. Funktioniert das auch, wenn J2EE-Clients (oder andere) auf den Webservice zugreifen wollen? Habe gelesen, dass man das dann besser mit SOAP-Headern erledigt, weil das eher dem Standard entspricht.

      3. Was ist, wenn das das WebGateway mit der ASP.NET Engine zwecks Skalierung auf einem anderen Host als der ApplicationServer, der die Webdienste zur Verfügung stellt, liegt?

      Grüße und Danke nochmal,
      Patric

      Comment

      Working...
      X