2009-10-23 248 views
2

我通過pagemethods訪問會話中的值時遇到問題。通過pagemethods訪問時的會話問題

下面的示例以簡單的形式演示該問題。頁面上有三個按鈕,每個按鈕都會調用不同的頁面方法,從而訪問我期望會話中相同的變量。實際上,每個頁面方法的返回值都不相同,如下所示。

我只在部署到網絡服務器時出現此問題;當我在本地測試時,這不是問題。

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> 

回答

6

您需要爲您的Web方法啓用會話狀態。

實施例:

<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 article獲得更多信息。

+0

謝謝,工作正常 – user23048345 2009-10-26 10:34:59