C# ASP.Net会话在对ASPX WebMethod的AJAX调用之间更改
我有一个单页应用程序,它从default.aspx开始创建基本的HTML布局,然后使用AJAX调用从其他aspx页面中的静态WebMethods获取数据。我还有一个KeepAlive.aspx,它每隔一段时间重新加载一次,以保持会话的活力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
最初出现的登录表单调用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[“”]
vsHttpContext时会有所不同。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[“”]
vsHttpContext时会有所不同。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;
}