ASP.Net会话在ASPX WebMethod

时间:2016-01-07 22:41:41

标签: c# asp.net ajax

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

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

我调用的下一个Web方法是使用在登录时获取的身份信息从外部Web服务获取用户权限。

这在各种IIS服务器上运行良好且花花公子。最近我们在新的服务器上部署了它,但它不能在那里工作。

它确实成功登录并在会话中保存用户值,但是当下一次ajax调用getuserpreferences时,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不起作用。

代码:

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

Preference Manager.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)

 private void SetUser(HttpContext obj, userInfo user)
    {
        HttpSessionState session = obj.Session;

        session["vUserInfo"] = user;
        ....
        session["vDataToken"] = setting.ContainsKey("token") ? setting["token"] : "0-0";
    }

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。

1 个答案:

答案 0 :(得分:0)

简单易用 HttpContext.Current.Session["user_id"] = ""