无法从客户端的ajax获取Web服务中的会话状态

Cannot get Session state in Web Service from ajax on client

本文关键字:Web 服务 会话状态 获取 ajax 客户端      更新时间:2023-09-26

我希望每个用户只有1个会话。但是当我运行ajax查询时,系统会生成一个新的会话。当我在我的计算机上调试模式下测试它时,没有任何问题。仅在分布式应用程序的客户端站点出现问题。

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'会话元素的Asp按钮:

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();
}

对Web Service的Ajax查询

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");
        }
    });
}

按钮中的代码只是将1添加到会话["ConnectCount"]。

所以当我点击5次Asp按钮和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>

这是在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();
    }

参考
如何在webmethod中访问session ?