Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Web services 根据请求在同一线程上创建/处置用户作用域_Web Services_<img Src="//i.stack.imgur.com/WM7S8.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">servicestack - Fatal编程技术网 servicestack,Web Services,servicestack" /> servicestack,Web Services,servicestack" />

Web services 根据请求在同一线程上创建/处置用户作用域

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)//将其

我将ServiceStack与ASP.NET web表单和表单身份验证一起使用。每次服务调用我需要以下逻辑:

/--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的线程问题,我可能会认为您可能设计过度了,但如果不知道您想做什么,就很难说出来。

谢谢您的回答。我用当前的解决方案更新了问题。你看到它有什么问题吗?看起来是这样,但我不确定潜在的线程问题,如果有。谢谢你的回答。我用当前的解决方案更新了问题。你看到它有什么问题吗?看起来是这样,但我不确定潜在的线程问题,如果有。