我有一个单页面应用程序,从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。
答案 0 :(得分:0)
简单易用
HttpContext.Current.Session["user_id"] = ""