我有一个MVC 3应用程序,它使用asp验证 当用户登录应用程序时,validadion会成功并在会话变量中输入用户名。
在这里,作品很好。
然后在AccountController中设置RedirectionToAction到另一个控制器,这里会话变量丢失。
**//HERE THE VARIABLES ARE LOST AND AN ERROR HAPPENS**
return RedirectToAction("menuOtbr", "Menu", new { area = "Configuracion" });
我试过
添加受保护的 void Session_Start(){} 没有任何反应。会话无法启动或重新启动。
其他许多建议几乎所有与这个相关主题一起发表的文章都是由我提出的。
这是我的代码:
[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
if (ModelState.IsValid)
{
// Se inicializa variables para el gestor de mensajes
SessionBag.Current.ErrorMessageAuto = new ArrayList();
SessionBag.Current.ErrorMessage = null;
SessionBag.Current.ErrorReturnTo = null;
//Se verifica si el usuario es válido en el contexto de SQL Server, esto para guardar
//compatibilidad con el diseño de Merlin para Escritorio.
Db_Conexion db = new Db_Conexion(model.UserName,model.Password);
if (!db.connect())
{
model.UserName = null;
model.Password = null;
SessionBag.Current.ErrorReturnTo = "link";
SessionBag.Current.ErrorMessage = db.ExceptionsText();
return View("Mensajes");
}
db.close();
if (Membership.ValidateUser(model.UserName, model.Password))
{
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
SessionBag.Current.UserName = model.UserName;
if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
&& !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
{
return Redirect(returnUrl);
}
else
{
**//HERE THE VARIABLES ARE LOST AND AN ERROR HAPPENS**
return RedirectToAction("menuOtbr", "Menu", new { area = "Configuracion" });
}
}
else
{
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
我在root的项目中有帐户控制器,而另一个控制器由区域构成。
花了将近10天的时间来解决这个问题。任何想法,帮助都会非常苛刻。
在部署或生产时启动相同的错误。
这篇文章Losing my session variables - What exception might cause sessions to be lost?
说一些IIS配置。但并不能准确解释需要配置的内容。
SessionBags代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Dynamic;
namespace ParadigmaNet.Infraestructure
{
public sealed class SessionBag : DynamicObject
{
private static readonly SessionBag sessionBag;
static SessionBag()
{
sessionBag = new SessionBag();
}
private SessionBag()
{
}
private HttpSessionStateBase Session
{
get { return new HttpSessionStateWrapper(HttpContext.Current.Session); }
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = Session[binder.Name];
return true;
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
Session[binder.Name] = value;
return true;
}
public override bool TryGetIndex(GetIndexBinder
binder, object[] indexes, out object result)
{
int index = (int)indexes[0];
result = Session[index];
return result != null;
}
public override bool TrySetIndex(SetIndexBinder binder,
object[] indexes, object value)
{
int index = (int)indexes[0];
Session[index] = value;
return true;
}
public static dynamic Current
{
get { return sessionBag; }
}
}
}
答案 0 :(得分:2)
经过数天和数小时的测试,在web.config上发现了一些问题。
最近我们将我们的应用程序从MVC3更改为MVC4,并在boot strucutres上找到web.config之间的一些差异,我们做了一些更改,删除了一些键并添加了其他键。
之后一切正常。
我们生成一个干净的MVC4应用程序,然后将web.config与旧的web.config进行比较,并且procceed删除一些密钥并修改其他密钥。
答案 1 :(得分:1)
而不是尝试调试会话包如何简化这一点。当用户登录时,只需设置Sesssion [“test”] = DateTime.Now
然后直接从每个控制器写出来。
如果新会话无法启动,我不相信您的会话会丢失,并倾向于认为它是一个实施问题。
当您认为丢失时,您的会话ID是否在每个请求中发送过来?我猜它是,因此你没有看到新的会话被创建。
如果上面的测试有效,那么你知道这是一个会话包实现问题..