2011-06-22 93 views
1

是否可以在ASP.NET MVC中(無需編寫太多代碼)手動選擇當前sessionId是什麼?我不是說要創建我自己的sessionId,而是想將sessionId存儲在自定義標題中,而不是存儲在cookie或url中。我不介意,如果我需要讀出的首自己和做這樣的事情在request_start:在自定義標題中使用ID的ASP.NET MVC會話

Request.Session = new SessionState(Request.Headers["sessionId"]); 

最主要的是,我不希望存儲會話狀態在Cookie(曲奇以來將不會在應該與mvc應用程序對話的設備上啓用),並且我不希望解析客戶端上的url,然後使用插入到url中的sessionId重新發送所有內容。另外,如果我不能用原生的Session對象來做到這一點,我也不介意這一點,我只需要一個快速而簡單的解決方案,讓自定義標題中的令牌而不是cookie。

回答

0

我知道你提到不想解析URL,但使用的URL與路由似乎是一個簡單而快速的解決方案,將參數添加到您的路線:

在您的Global.asax

routes.MapRoute(
    "SessionIdUrl", 
    "{sessionId}/{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index", id = "" } 
); 

創建一個基本控制器,使會話ID提供給您的控制器:

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。

當用戶登錄時,開始在您的Url中使用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,你很可能會成爲提供更好的可能會識別用戶當前所使用的內容。

+0

這對會話處理有什麼幫助? – Alxandr