servicestack,Asp.net Mvc,Session,servicestack" /> servicestack,Asp.net Mvc,Session,servicestack" />

Asp.net mvc 当不从MVC上下文调用方法时,如何在方法中保存servicestack会话

Asp.net mvc 当不从MVC上下文调用方法时,如何在方法中保存servicestack会话,asp.net-mvc,session,servicestack,Asp.net Mvc,Session,servicestack,我看过: 我仍然不明白,如果我有一个我想从MVC控制器和servicestack服务调用的类方法,我怎么能保存会话。是否可以不传递服务引用?…下面是我的用例: public async Task<User> StoreAsync(User user, CustomUserSession session) { using (var db = DbFactory.Open()) { await db.SaveAsyn

我看过:

我仍然不明白,如果我有一个我想从MVC控制器和servicestack服务调用的类方法,我怎么能保存会话。是否可以不传递服务引用?…下面是我的用例:

    public async Task<User> StoreAsync(User user, CustomUserSession session)
    {
        using (var db = DbFactory.Open())
        {
            await db.SaveAsync(user).ConfigureAwait(false);
        }
        if (session != null)
        {
            session.EmailConfirmed = user.EmailConfirmed;
            session.ProfileImageUrl = user.ProfileImageUrl;
            session.ThumbnailProfileImageUrl = user.ThumbnailProfileImageUrl;

            //Following only works if I am calling the method from an MVC controller
            IHttpRequest httpReq = HttpContext.Current.ToRequest();
            httpReq.SaveSession(session);

            //What if I call this method from a servicestack service, 
            //I don't really want to inject the service as an optional parameter
        }
        return user;
    }
public async Task StoreAsync(用户-用户,CustomUserSession会话)
{
使用(var db=DbFactory.Open())
{
await db.SaveAsync(用户).ConfigureAwait(false);
}
if(会话!=null)
{
session.emailconfirm=user.emailconfirm;
session.ProfileImageUrl=user.ProfileImageUrl;
session.ThumbnailProfileImageUrl=user.ThumbnailProfileImageUrl;
//仅当我从MVC控制器调用该方法时,以下操作才起作用
IHttpRequest httpReq=HttpContext.Current.ToRequest();
httpReq.SaveSession(会话);
//如果我从servicestack服务调用此方法,
//我真的不想将服务作为可选参数注入
}
返回用户;
}

为了保存会话,您需要访问当前HTTP请求,以便访问附加到传入请求的用户cookie

会话Wiki显示了从ServiceStack服务外部访问的不同方式:

IHttpRequest httpReq = aspCtx.ToRequest(); //HttpContext
IHttpRequest httpReq = aspReq.ToRequest(); //MVC HttpRequestBase
IHttpRequest httpReq = listenerCtx.ToRequest(); //HttpListenerContext

//In ASP.NET hosts via the singleton
IHttpRequest httpReq = HostContext.AppHost.TryGetCurrentRequest(); 
访问当前的
IRequest
后,可以使用
SaveSession()
扩展方法保存键入的会话:

httpReq.SaveSession(session);

您只能通过HTTP请求上下文中的
HttpContext.current
singleton访问当前请求,因此需要确保
HttpContext.current
不为空。当您需要从HTTP工作线程解析
IHttpRequest
时,如果在后台线程上执行异步方法,则通过后台线程访问时,它将为null。这可能是您的问题。

感谢您的快速回答!我将使用ConfigureAwait(true)尝试几次;而不是ConfigureAwait(false),然后尝试删除异步。是的,这只是ConfigureAwait,我会先把它放在适当的位置,然后在稍后传递会话时不考虑它。