是否可以在ASP.NET MVC中(无需编写太多代码)手动选择当前sessionId是什么?我不是想创建自己的sessionId,而是想将sessionId存储在自定义标头中,而不是存储在cookie或url中。我不介意我是否需要自己阅读标题并在request_start中执行类似的操作:
Request.Session = new SessionState(Request.Headers["sessionId"]);
主要的是我不想将会话状态存储在cookie中(因为cookie不会在应该与mvc应用程序通信的设备上启用),我不想要必须解析客户端上的url然后重新发送插入到url中的sessionId的所有内容。
此外,如果我不能使用本机Session-object执行此操作,我也不介意,我只需要一个快速简单的解决方案,在自定义标头而不是cookie中使用令牌。
答案 0 :(得分:0)
我知道您提到不想解析网址,但使用带路由的网址似乎是一个简单而快速的解决方案,请将参数添加到路线中:
在你的Global.asax
中routes.MapRoute(
"SessionIdUrl",
"{sessionId}/{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = "" }
);
创建一个基本控制器并使SessionId对您的控制器可用:
public class BaseController : Controller
{
public string UrlSessionId { get; set; }
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
object sessionId = "";
if (filterContext.RouteData.Values.TryGetValue("sessionId", out sessionId))
{
UrlSessionId = sessionId.ToString();
}
}
}
在您的控制器上继承此基本控制器:
public class HomeController : BaseController
因此您的控制器可以访问base.UrlSessionId。
用户登录后,开始在您的网址中使用sessionId;
[HttpPost]
public ActionResult SignIn(User data)
{
// authenticate
return RedirectToAction("AfterSignedIn", new { sessionId = Session.SessionID, id = "my id" } );
}
在您的观看中,使用SessionId创建链接,如下所示:
@Html.ActionLink("My link", "ActionWithUrlSession", "YourController", new { sessionId = Session.SessionID, id = "my id" }, null)
在这里,您实际上可以使用除Session.SessionID以外的任何其他内容,您可能会更好地识别用户当前所拥有的内容。