سؤال

لدي مشكلة في الوصول إلى القيم في الجلسة من خلال pagemethods.

يوضح المثال أدناه المشكلة في شكل بسيط. هناك ثلاثة أزرار على الصفحة وكل من هذه الأزرار تستدعي pagemethod مختلفة ، والتي بدورها تصل إلى ما أتوقع أن يكون نفس المتغير من الجلسة. في الواقع ، تختلف القيمة التي تم إرجاعها لكل pagemethod ، كما هو موضح أدناه.

أحصل على هذه المشكلة فقط عندما أقوم بنشر خادم الويب ؛ إنها ليست مشكلة عندما أختبرها محليًا.

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>
هل كانت مفيدة؟

المحلول

تحتاج إلى تمكين حالة الجلسة لطرق الويب الخاصة بك.

مثال:

<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

ألق نظرة على هذا مقال MSDN للمزيد من المعلومات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top