Web services 根据请求在同一线程上创建/处置用户作用域
我将ServiceStack与ASP.NET web表单和表单身份验证一起使用。每次服务调用我需要以下逻辑:Web services 根据请求在同一线程上创建/处置用户作用域,web-services,
servicestack,Web Services,
servicestack,我将ServiceStack与ASP.NET web表单和表单身份验证一起使用。每次服务调用我需要以下逻辑: /--on'Begin Request'-- var identity=HttpContext.Current.User.identity; 如果(!identity.IsAuthenticated) 抛出新的UnauthorizedAccessException(); var user=//使用identity.Name在数据库中查找用户 new UserScope(user)//将其
/--on'Begin Request'--
var identity=HttpContext.Current.User.identity;
如果(!identity.IsAuthenticated)
抛出新的UnauthorizedAccessException();
var user=//使用identity.Name在数据库中查找用户
new UserScope(user)//将其存储在某处(?)
//--关于“结束请求”--
var scope=//获取用户范围
scope.Dispose();
这种逻辑应该走向何方?开始请求部分似乎可以由请求过滤器处理,但我不认为这是最好的地方。应将UserScope
存储和处置在何处?它必须在同一线程上创建和释放
更新
我将ServiceRunner子类化为onbeforecute
/onafterecute
public override void onbeforecute(IRequestContext-requestContext,TRequest-request){
如果(!IsLoginRequest()){
var identity=HttpContext.Current.User.identity;
如果(身份验证){
var user=user.GetByUserName(identity.Name);
如果(用户!=null){
SetItem(USER_SCOPE_KEY,new UserScope(USER));
返回;
}
}
抛出新的UnauthorizedAccessException();
}
}
AfterExecute上的公共重写对象(IRequestContext requestContext,对象响应){
如果(!IsLoginRequest()){
var userScope=(userScope)requestContext.GetItem(USER\u SCOPE\u KEY);
if(userScope!=null)
Dispose();
}
返回响应;
}
并重写AppHost.CreateServiceRunner:
公共覆盖IServiceRunner CreateServiceRunner(ActionContext ActionContext){
返回新的MyServiceRunner(这是actionContext);
}
查看,似乎
OnBeforeExecute
/OnAfterExecute
应该在同一个线程上运行。有什么原因不能使用吗?我会研究如何使用ServiceSTack的IHttpRequest.Items字典。这个字典几乎可以在任何请求可用的地方使用,包括请求和响应过滤器。您可以存储范围并在需要时检索它
对于同一线程问题,您不能保证整个请求将在同一线程中发生。如果您担心asp.net的线程问题,我可能会认为您可能设计过度了,但在不知道您要做什么的情况下很难说。我会研究使用ServiceSTack的IHttpRequest.Items字典。这个字典几乎可以在任何请求可用的地方使用,包括请求和响应过滤器。您可以存储范围并在需要时检索它
对于同一线程问题,您不能保证整个请求将在同一线程中发生。如果您担心asp.net的线程问题,我可能会认为您可能设计过度了,但如果不知道您想做什么,就很难说出来。谢谢您的回答。我用当前的解决方案更新了问题。你看到它有什么问题吗?看起来是这样,但我不确定潜在的线程问题,如果有。谢谢你的回答。我用当前的解决方案更新了问题。你看到它有什么问题吗?看起来是这样,但我不确定潜在的线程问题,如果有。