Asp.net mvc 当不从MVC上下文调用方法时,如何在方法中保存servicestack会话
我看过: 我仍然不明白,如果我有一个我想从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
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,我会先把它放在适当的位置,然后在稍后传递会话时不考虑它。