2013-03-26 44 views
0

我想每个用户只有一个会话。但是当我运行ajax查询时,系统会生成新的会话。 当我在计算机上的调试模式下进行测试时,没有任何问题。仅在分布式应用程序的客户端站点上出现问题。无法从客户端上的ajax获取Web服务中的会话状态

ASP页:

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 
<input id="Text1" type="text" /><br /> 
<asp:Button ID="btn_ASP" runat="server" onclick="btn_ASP_Click" Text="Asp" /> 
<input id="btn_JS" type="button" value="JS" onclick="GetUsersList();" /><br /> 

天冬氨酸按钮,生成 'ConnectCount' 会话元素:

protected void btn_ASP_Click(object sender, EventArgs e) 
{ 
    int count; 
    if (HttpContext.Current.Session["ConnectCount"] == null) 
     count = 1; 
    else 
     count = (int)HttpContext.Current.Session["ConnectCount"] + 1; 
    HttpContext.Current.Session["ConnectCount"] = count; 
    TextBox1.Text = count.ToString();   
} 

Web服务代码:

[WebMethod(EnableSession = true)] 
[ScriptMethod] 
public string Get_UsersList2() 
{ 
    int count; 
    if (HttpContext.Current.Session["ConnectCount"] == null) 
     count = 1; 
    else 
     count = (int)HttpContext.Current.Session["ConnectCount"] + 1; 
    HttpContext.Current.Session["ConnectCount"] = count; 
    return count.ToString(); 
} 

的Ajax查询Web服务

function GetUsersList() {    
    $.ajax({ 
     url: '/WbSrv_ACTR.asmx/Get_UsersList2', 
     type: "POST", 
     contentType: "application/json; charset=utf-8", 
     data: '{}', 
     success: function (data, st) { 
      if (st == "success") { 
       if (data.d != "") { 
        text1.value = data.d; 
       } 
       else { 
       } 
      } 
     }, 
     error: function() { 
      alert("Cannot get list of users"); 
     } 
    }); 
} 

按钮中的代码只会将Session [“ConnectCount”]加1。

所以,当我点击天冬氨酸按钮5次和1次的JQ按钮(在本地IIS - 测试):

result: asp = 5, jq = 6 (correct) 

做服务器相同的操作IIS 7.5:

result: asp = 5, jq = 1 (incorrect) 

服务器使用其他会话。 为了测试 - 我已经添加了通过ASP按钮,在会议上,一些元素和Web服务无法找到他们(会话是空的存在,但的SessionID是一样的

任何人都可以有解决方案或解决方法吗?

Web配置:

<system.web> 
    <compilation debug="true" targetFramework="4.0"> 
    <assemblies> 
     <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
    </assemblies> 
    </compilation> 
    <customErrors mode="Off" /> 
    <authorization> 
     <deny users="?" /> 
    </authorization> 
</system.web> 
<system.webServer> 
    <security> 
     <authentication> 
      <windowsAuthentication enabled="true" /> 
      <anonymousAuthentication enabled="false" /> 
     </authentication> 
    </security> 
</system.webServer> 

回答

0

这是Web服务使用会话的方式不对

Session["ConnectCount"]; 

正确的做法是

HttpContext.Current.Session["ConnectCount"]; 

所以,你的功能应该是

[WebMethod(EnableSession = true)] 
    [ScriptMethod] 
    public string Get_UsersList2() 
    { 
     int count; 
     if (HttpContext.Current.Session["ConnectCount"] == null) 
      count = 1; 
     else 
      count = (int) HttpContext.Current.Session["ConnectCount"] + 1; 
     HttpContext.Current.Session["ConnectCount"] = count; 
     return count.ToString(); 
    } 

参考
How can I access session in a webmethod?

+0

感谢很多答案。我已经按照你的建议更改了代码。但不幸的是它并没有解决我的问题。当我运行ajax查询 - 系统获取与APS按钮相同的ID的Session,但它没有任何元素 - 会话是空的。但在调试模式下,所有工作正常 - 我可以在Session中添加参数,从asp按钮读取它从Web服务。 – Vladimir 2013-03-26 23:17:51