Vb.net 如何访问Web API控制器之外的Request.Properties
我在Vb.net 如何访问Web API控制器之外的Request.Properties,vb.net,asp.net-web-api,Vb.net,Asp.net Web Api,我在Request.Properties中设置一个属性,在我从传入Web API请求的头中提取一些数据之后,在DelegatingHandler中设置属性 这一切都很好。我还可以从控制器以及我的操作和异常过滤器中访问Request.Properties。但是,我还需要从控制器外部访问这些数据(我从控制器调用业务层类)。这是我想在其他地方的一些日志中包含的数据 我可以从这个类中看到HttpContext.Current,我可以从这里看到原始的标题,所以我想我可以再次将其提取出来,但由于我已经这样做
Request.Properties
中设置一个属性,在我从传入Web API请求的头中提取一些数据之后,在DelegatingHandler
中设置属性
这一切都很好。我还可以从控制器以及我的操作和异常过滤器中访问Request.Properties
。但是,我还需要从控制器外部访问这些数据(我从控制器调用业务层类)。这是我想在其他地方的一些日志中包含的数据
我可以从这个类中看到HttpContext.Current
,我可以从这里看到原始的标题,所以我想我可以再次将其提取出来,但由于我已经这样做了,并将其放入属性中,因此从那里获取它似乎更有意义。但是,我似乎无法从其他任何地方访问Request.Properties
如果这不是正确的方法,那么我将如何传递每个请求的数据,以便从Web API堆栈中的任何位置访问它
我还需要从控制器外部访问[Request.Properties
]数据(我从控制器调用业务层类)。这是我想在其他地方的一些日志中包含的数据。。。但是,我似乎无法从其他任何地方访问Request.Properties
。如果这不是正确的方法,那么我将如何传递每个请求的数据,以便从Web API堆栈中的任何位置访问它
您可以从HttpContext.Current
获得它,尽管它不太理想。请记住,如果任何其他非web应用程序使用相同的业务层,则HttpContext.Current
将为空HttpContext.Current
仅当您在IIS中运行时才为非null,并且IIS线程正在处理请求堆栈的执行。如果您计划在没有IIS的情况下使用OWIN自托管web api,则不会有HttpContext.Current
就个人而言,如果数据真的足够重要,可以传递到业务层进行记录,那么我只需将其传递到业务层方法:
public Task<HttpResponseMessage> SomeAction(SomeModel model) {
... other code
someBusinessLayerObject.SomeMethod(arg1, arg2, Request.Properties["myHeaderKey"]);
}
我还需要从控制器外部访问[Request.Properties
]数据(我从控制器调用业务层类)。这是我想在其他地方的一些日志中包含的数据。。。但是,我似乎无法从其他任何地方访问Request.Properties
。如果这不是正确的方法,那么我将如何传递每个请求的数据,以便从Web API堆栈中的任何位置访问它
您可以从HttpContext.Current
获得它,尽管它不太理想。请记住,如果任何其他非web应用程序使用相同的业务层,则HttpContext.Current
将为空HttpContext.Current
仅当您在IIS中运行时才为非null,并且IIS线程正在处理请求堆栈的执行。如果您计划在没有IIS的情况下使用OWIN自托管web api,则不会有HttpContext.Current
就个人而言,如果数据真的足够重要,可以传递到业务层进行记录,那么我只需将其传递到业务层方法:
public Task<HttpResponseMessage> SomeAction(SomeModel model) {
... other code
someBusinessLayerObject.SomeMethod(arg1, arg2, Request.Properties["myHeaderKey"]);
}
使用类似于DI(依赖项注入)的东西。我有一个很好的例子,前几天我刚刚回答了(很抱歉我的回答被无耻地插入)。如果您使用列出的
解决方案2-IoC/DI
,您可以重复使用此解决方案。根据需要更新WebUserInfo
类(在答案顶部)和界面。添加Autofac框架。现在将您的IUserInfo
接口注入到服务层的构造函数中,Autofac将处理其余部分,现在您可以在需要时访问它。注意,如果您从HttpContext.Current
中提取,则代码仅在IIS下运行时才起作用。使用OWIN自托管web api,没有HttpContext.Current
(除非您的应用程序手动设置)。忘了提一下:您还需要向DI框架注册服务类型,它们可以注入web api控制器。如果使用多个项目,请确保在中心位置定义公共接口。但在这种情况下,DI框架才是真正的亮点。@Igor感谢您的建议。我是DI的拥护者,但我认为在这种情况下使用DI有点重。另外,我的客户对它一点也不熟悉,所以我不想为了这么小的需要而在他们身上释放这个概念。这一天即将到来,但不是现在!使用类似于DI(依赖项注入)的东西。我有一个很好的例子,前几天我刚刚回答了(很抱歉我的回答被无耻地插入)。如果您使用列出的解决方案2-IoC/DI
,您可以重复使用此解决方案。根据需要更新WebUserInfo
类(在答案顶部)和界面。添加Autofac框架。现在将您的IUserInfo
接口注入到服务层的构造函数中,Autofac将处理其余部分,现在您可以在需要时访问它。注意,如果您从HttpContext.Current
中提取,则代码仅在IIS下运行时才起作用。使用OWIN自托管web api,没有HttpContext.Current
(除非您的应用程序手动设置)。忘了提一下:您还需要向DI框架注册服务类型,它们可以注入web api控制器。如果使用多个项目,请确保在中心位置定义公共接口。但在这种情况下,DI框架才是真正的亮点。@Igor感谢您的建议。我是DI的拥护者,但我认为在这种情况下使用DI有点重。另外,我的客户对它一点也不熟悉,所以我不想为suc在他们身上释放这个概念