0

各ユーザーに 1 つのセッションのみを提供したいと考えています。しかし、ajax クエリを実行すると、システムは新しい 1 つのセッションを生成します。コンピューターのデバッグ モードでテストしたところ、問題はありませんでした。分散アプリケーションのクライアント サイトでのみ問題が発生しました。

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 サービスへの 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");
        }
    });
}

ボタンのコードは、Session["ConnectCount"] に 1 を追加するだけです。

したがって、Asp ボタンを 5 回クリックし、JQ ボタンを 1 回クリックすると (ローカル IIS - テスト):

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

サーバー IIS 7.5 で同じ操作を行います。

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

サーバーは他のセッションを使用しています。テストのために、ASP ボタンを介してセッションにいくつかの要素を追加しましたが、Web サービスでそれらを見つけることができませんでした (セッションは空でしたが、 SessionID は同じでした) 。

誰かが解決策または回避策を持っていますか?

ウェブ構成:

<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>
4

1 に答える 1

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

参照
Web メソッドでセッションにアクセスするにはどうすればよいですか?

于 2013-03-26T09:29:18.803 に答える