簡體   English   中英

如何在沒有身份驗證機制的情況下在服務堆棧中使用asp.net mvc會話

[英]How to use the asp.net mvc session in service stack without authentication mechanism

我正在研究Asp.Net MVC和服務堆棧。 我正在嘗試實現這一點,請在服務堆棧服務類中使用asp.net mvc會話。 就是說

Public ActionResult Index()
{
    Session["username"]="xxx";
    return View();
}

從現在開始,我需要能夠在服務堆棧服務類中使用Session["username"] ,但是我無法在服務堆棧服務類中使用Session。 HttpContext.Current.Session引發null異常。 我提到了Social Bootstrap Api服務堆棧示例項目,因為它們使用CustomUserSession類,這意味着在身份驗證之后,他們會將數據存儲到會話中,例如,

Plugins.Add(new AuthFeature(
                () => new CustomUserSession(), //Use your own typed Custom UserSession type
                new IAuthProvider[] {
                    new CredentialsAuthProvider()
}));

但是在我的應用程序中沒有身份驗證機制,但是我需要將一些信息存儲到會話中,並在服務堆棧服務類中使用該會話。

要在服務堆棧中啟用會話而無需身份驗證,我們使用

Plugins.Add(new SessionFeature());

因此,如何在未經身份驗證的情況下在服務堆棧中使用asp.net mvc會話。 請指導我。

要知道的一個重要區別是ServiceStack會話是完全獨立的,並且與ASP.NET會話沒有任何關系(名稱除外)。 在大多數情況下,ServiceStack中的會話只是存儲在已注冊的緩存提供程序中的blob ,並由隨每個HTTP請求發送的SessionId Cookies引用。

在ASP.NET MVC中訪問ServiceStack會話的最簡單方法是擴展ServiceStackController並使用SessionAs<T>()方法訪問鍵入的會話,例如:

public class MyMvcController : ServiceStackController
{
    public ActionResult Index()
    {
        MyUserSession myServiceStackSession = base.SessionAs<MyUserSession>();

        return View();
    }
}

這利用了注入到base.Cache屬性中的已注冊ICacheClient提供程序。 您可以通過設置MVC的SetControllerFactory()來使用ServiceStack的IOC自動連接具有在ServiceStack的IOC中注冊的依賴項的ASP.NET MVC控制器,例如:

public override void Configure(Funq.Container container)
{
    //Set MVC to use the same Funq IOC as ServiceStack
    ControllerBuilder.Current.SetControllerFactory(
        new FunqControllerFactory(container));
}

否則,如果要為ASP.NET MVC控制器和ServiceStack使用不同的IOC,則需要在MVC IOC中注冊與ServiceStack的IOC中注冊的相同的ICacheClient Provider 如果未注冊CacheClient,則ServiceStack默認使用MemoryCacheClient

有關將ServiceStack與ASP.NET MVC集成的更多信息,請參見Wiki。

在ServiceStack Services中訪問ASP.NET請求和會話

當托管在ASP.NET上時,您可以使用以下命令訪問基礎的ASP.NET請求:

public class MyServices : Service
{
    public object Any(MyRequest request)
    {
        var aspReq = base.Request.OriginalRequest as HttpRequestBase;
        if (aspReq != null)
        {
            var value = aspReq.RequestContext.HttpContext.Session["key"];
        }

        //or if you prefer via the ASP.NET Singleton:
        var value = HttpContext.Current.Session["key"];
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM