C# ASP.Net会话在对ASPX WebMethod的AJAX调用之间更改

C# ASP.Net会话在对ASPX WebMethod的AJAX调用之间更改,c#,asp.net,ajax,C#,Asp.net,Ajax,我有一个单页应用程序,它从default.aspx开始创建基本的HTML布局,然后使用AJAX调用从其他aspx页面中的静态WebMethods获取数据。我还有一个KeepAlive.aspx,它每隔一段时间重新加载一次,以保持会话的活力 最初出现的登录表单调用login webmethod,该方法使用外部web服务登录并在会话中存储用户信息。我使用HttpContext.Current.Session获取和设置会话中的值 我调用的下一个web方法是使用登录时获得的身份信息从外部web服务获取U

我有一个单页应用程序,它从default.aspx开始创建基本的HTML布局,然后使用AJAX调用从其他aspx页面中的静态WebMethods获取数据。我还有一个KeepAlive.aspx,它每隔一段时间重新加载一次,以保持会话的活力


最初出现的登录表单调用login webmethod,该方法使用外部web服务登录并在会话中存储用户信息。我使用HttpContext.Current.Session获取和设置会话中的值

我调用的下一个web方法是使用登录时获得的身份信息从外部web服务获取UserPreferences

这一切都在各种IIS服务器上运行良好。最近我们在一个新服务器上部署了它,但它在那里不起作用

它确实成功登录并在会话中保存用户值,但是当下一个对getuserpreferences的ajax调用发生时,getuserpreferences web方法尝试获取会话值。。。它不再存在了

我输入了大量日志,看到会话Id正在更改!登录会话id与我在get userpreferences中看到的会话id不同,尽管两者都使用HttpContext.Current.session

在它确实工作的服务器上,有时(随机地?)它也会以类似的方式运行:它会丢失会话值,并让我重新登录

请提供帮助/提示以跟踪此问题,并确保相同的会话在ajax调用中继续进行。这不是一个MVC或WebAPI项目;这是一个简单的aspx应用程序

更新(1月8日):我发现了它工作的实例和不工作的实例之间的行为差异:ASP.Net_SessionId cookie值是在它工作的地方设置的,但在这种情况下它没有设置,因此没有维护会话状态。现在我需要弄清楚为什么它没有设置

更新2(1月8日):当我们在服务器上安装证书并实现https时,会话Id cookie开始出现。因此,尽管这个问题不再紧迫,但我确实想找出HTTP不起作用的原因

代码:

webserviceheloper.js

    WebServiceHelper.prototype.invokeServiceMethod = function(serviceName, methodName, params, returntype) {
    var self = this;
    var obj = {};
    var def = $.Deferred();
    var url = serviceName + "/" + methodName;
    $.support.cors = true;
    $.ajax({
        url: url,
        data: ko.toJSON(params),
        type: "POST",
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        success: function(mydata) {

            if (mydata && mydata.d) {

                    def.resolve(mydata.d);
                }                

        },
        error: function(msg) {

                def.reject(msg);
        }
    });

    return def.promise();
};
Data Provider.js:

   DataProvider.prototype.loginUser = function(email, password, token) {
    var self = this;
    var def = $.Deferred();

    var webServiceHelper = new WebServiceHelper();

    webServiceHelper.invokeServiceMethod("Login.aspx", "LoginUser", { email: email, password: password, token: token }, "json").done(function (retObj) {
        self.userObj = retObj.userinfo;
        self.loginTime = new Date();
        self.loadInitialData();
        def.resolve();
    }).fail(
        function(retObj1) {
                def.reject(retObj1);
        });

    return def.promise();
};
首选项管理器.js

    PreferenceManager.prototype.invokeGetPreferences = function (prefKey) {
    var self = this;

    var def = $.Deferred();

    var webServiceHelper = new WebServiceHelper();

    webServiceHelper.invokeServiceMethod("WebMethods.aspx", "GetPreferences", { key: prefKey }, "json").done(function (retObj) {
        def.resolve(retObj);
    }).fail(
        function (retObj1) {
                def.reject(retObj1);
        });

    return def.promise();

};
Login.aspx.cs:

        [WebMethod(EnableSession=true)]
    public static string LoginUser(string email, string password, string token)
    {
        if (Authenticate(email, password, token))
        {
            HttpContext.Current.Session["vanalyticsLastLoginDateTime"] = DateTime.Now;

            var userjson =  GetUserJson();

            Logger.Debug("Login - Session Id {0} - Returning user json {1}", HttpContext.Current.Session.SessionID, userjson);

            return userjson;
        }

        return "Error: " + _validationError;
    }

        private static bool Authenticate(string stremail, string strpassword, string token)
    {
        var vplug = new vPlugin();

        HttpContext.Current.Session.Remove("vUserInfo");

        vplug.Authenticate(HttpContext.Current, appsurl, stremail, strpassword, token);

        _validationError = vplug.LastException != null ? vplug.LastException.Message : null;

        return (HttpContext.Current.Session["vUserInfo"] != null);
    }
vPlugin代码:(最终调用setuser)

WebMethods.aspx:

    [WebMethod(EnableSession=true)]
    public static string GetPreferences(string key)
    {
        var myadr = new ADR.VrtDataService { Timeout = 20000 };

        var token = GetTokenFromSession();

        try
        {
            var result = myadr.getPreference(token, key);

            myadr.Dispose();

            return result;
        }
        catch (Exception ex)
        {
            return "Error: " + ex.Message;
        }
    }

       public static string GetTokenFromSession()
    {
        var token = "";

        var val2 = HttpContext.Current.Session["vDataToken"];

        if (val2 != null)
        {
            token = (string) val2;
        }
        else
        {
            Logger.Error("Token is blank, session id is " + HttpContext.Current.Session.SessionID);
        }

        return token;
    }
我得到的是“令牌为空”,会话id与先前登录方法记录的id不同

另外,请注意,整个代码都是JavaScript,而aspx只作为会话的RESTful API使用。

使用起来很简单
HttpContext.Current.Session[“user\u id”]=“它很简单,只需使用

HttpContext.Current.Session[“user\u id”]=“需要查看一些代码您使用的是
Session[“some Session”]
还是
HttpContext.Current.Session[“some Session”]
会话启动方法。。仅使用
Session[“”]
vs
HttpContext时会有所不同。Current.Session[“”]
construct显示一些与声明和初始化会话变量的位置相关的代码。。同样,在进行登录屏幕时,假设您使用母版页,并且登录屏幕与应用程序的其余部分分开。。您将有一个会话问题i使用HttpContext.Current.session['property']@RazaAli好的,这是一个好的开始。。你在哪里初始化它。。?在on session start中,是否将其
=
设置为`string.Empty;或者其他一些值现在向问题添加一些代码。需要查看一些代码您是否使用了
Session[“some Session”]
HttpContext.Current.Session[“some Session”]
还使用了
Global.asax
OnSession启动方法。。仅使用
Session[“”]
vs
HttpContext时会有所不同。Current.Session[“”]
construct显示一些与声明和初始化会话变量的位置相关的代码。。同样,在进行登录屏幕时,假设您使用母版页,并且登录屏幕与应用程序的其余部分分开。。您将有一个会话问题i使用HttpContext.Current.session['property']@RazaAli好的,这是一个好的开始。。你在哪里初始化它。。?在on session start中,是否将其
=
设置为`string.Empty;或者其他一些值现在给问题添加一些代码。
    [WebMethod(EnableSession=true)]
    public static string GetPreferences(string key)
    {
        var myadr = new ADR.VrtDataService { Timeout = 20000 };

        var token = GetTokenFromSession();

        try
        {
            var result = myadr.getPreference(token, key);

            myadr.Dispose();

            return result;
        }
        catch (Exception ex)
        {
            return "Error: " + ex.Message;
        }
    }

       public static string GetTokenFromSession()
    {
        var token = "";

        var val2 = HttpContext.Current.Session["vDataToken"];

        if (val2 != null)
        {
            token = (string) val2;
        }
        else
        {
            Logger.Error("Token is blank, session id is " + HttpContext.Current.Session.SessionID);
        }

        return token;
    }