自定义标头中带有ID的ASP.NET MVC会话

时间:2011-06-22 12:21:53

标签: c# asp.net asp.net-mvc session-state

是否可以在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中使用令牌。

1 个答案:

答案 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以外的任何其他内容,您可能会更好地识别用户当前所拥有的内容。