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在他们身上释放这个概念