Sitzungsproblem, wenn er über Pagemethods zugegriffen wird
-
06-07-2019 - |
Frage
Ich habe ein Problem mit dem Zugriff auf Werte in der Sitzung über Pagemethods.
Das folgende Beispiel zeigt das Problem in einfacher Form. Auf der Seite befinden sich drei Schaltflächen und jede davon ruft einen anderen Pagemethod auf, der wiederum auf das zugreift, was ich als die gleiche Variable aus der Sitzung erwarten würde. Tatsächlich ist der zurückgegebene Wert für jeden Pagemethod unterschiedlich, wie unten gezeigt.
Ich erhalte dieses Problem nur, wenn ich mich für den Webserver bereitstelle. Es ist kein Problem, wenn ich es lokal teste.
Example output:
Method Session Value
DoMethod1 597cbe1c-5391-4b93-af6b-0da0068b264b
DoMethod2 35df48aa-8a58-4008-b353-be7b9f950395
DoMethod3 35df48aa-8a58-4008-b353-be7b9f950395
DoMethod1 597cbe1c-5391-4b93-af6b-0da0068b264b
DoMethod2 597cbe1c-5391-4b93-af6b-0da0068b264b
DoMethod1 35df48aa-8a58-4008-b353-be7b9f950395
DoMethod3 35df48aa-8a58-4008-b353-be7b9f950395
DoMethod1 597cbe1c-5391-4b93-af6b-0da0068b264b
DoMethod2 597cbe1c-5391-4b93-af6b-0da0068b264b
DoMethod3 35df48aa-8a58-4008-b353-be7b9f950395
Imports System.Web.Services
Public Class MethodResult
Public MethodName As String
Public SessionID As String
Public SessionValue As Object
End Class
Partial Public Class sessiontest
Inherits System.Web.UI.Page
<WebMethod()> _
Public Shared Function DoMethod1() As MethodResult
If HttpContext.Current.Session("sharedvalue") Is Nothing Then
HttpContext.Current.Session("sharedvalue") = Guid.NewGuid
End If
Dim ret = New MethodResult
ret.MethodName = "DoMethod1"
ret.SessionID = HttpContext.Current.Session.SessionID
ret.SessionValue = HttpContext.Current.Session("sharedvalue")
Return ret
End Function
<WebMethod()> _
Public Shared Function DoMethod2() As MethodResult
If HttpContext.Current.Session("sharedvalue") Is Nothing Then
HttpContext.Current.Session("sharedvalue") = Guid.NewGuid
End If
Dim ret = New MethodResult
ret.MethodName = "DoMethod2"
ret.SessionID = HttpContext.Current.Session.SessionID
ret.SessionValue = HttpContext.Current.Session("sharedvalue")
Return ret
End Function
<WebMethod()> _
Public Shared Function DoMethod3() As MethodResult
If HttpContext.Current.Session("sharedvalue") Is Nothing Then
HttpContext.Current.Session("sharedvalue") = Guid.NewGuid
End If
Dim ret = New MethodResult
ret.MethodName = "DoMethod3"
ret.SessionID = HttpContext.Current.Session.SessionID
ret.SessionValue = HttpContext.Current.Session("sharedvalue")
Return ret
End Function
End Class
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="sessiontest.aspx.vb" Inherits="project1.sessiontest" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />
<script type="text/javascript">
function method1() {
PageMethods.DoMethod1(methodComplete);
}
function method2() {
PageMethods.DoMethod2(methodComplete);
}
function method3() {
PageMethods.DoMethod3(methodComplete);
}
//complete
function methodComplete(result) {
document.getElementById('output').innerHTML += "<tr><td>" + result.MethodName + "</td><td>" + result.SessionID + "</td><td>" + result.SessionValue + "</td></tr>";
}
</script>
<div>
<input type="button" value="Method 1" onclick="method1();" id="btn1" />
<br />
<input type="button" value="Method 2" onclick="method2();" id="Button1" />
<br />
<input type="button" value="Method 3" onclick="method3();" id="Button2" />
<br />
<table id="output" style="width:100%;">
<tr>
<th>Method Name</th>
<th>Session ID</th>
<th>Session Value</th>
</tr>
</table>
</div>
</form>
</body>
</html>
Lösung
Sie müssen den Sitzungsstatus für Ihre Webmethoden aktivieren.
Beispiel:
<WebMethod(EnableSession:=True)> _
Public Shared Function DoMethod1() As MethodResult
If HttpContext.Current.Session("sharedvalue") Is Nothing Then
HttpContext.Current.Session("sharedvalue") = Guid.NewGuid
End If
Dim ret = New MethodResult
ret.MethodName = "DoMethod1"
ret.SessionID = HttpContext.Current.Session.SessionID
ret.SessionValue = HttpContext.Current.Session("sharedvalue")
Return ret
End Function
Schau dir das an MSDN -Artikel für mehr Informationen.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow