【发布时间】:2016-05-03 12:39:18
【问题描述】:
我有一个问题,RegisterHttpRequestMessage 不适合我,并且无法弄清楚我做错了什么。特别是当我尝试手动解析接受 HttpMessageRequest 作为参数的服务时。
我正在使用模块在我的构建器中注册组件,目前我在主 Web 项目中的模块如下所示:
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
builder.RegisterHttpRequestMessage(GlobalConfiguration.Configuration);
builder.RegisterType<SourceSystemViewModel>().AsImplementedInterfaces().InstancePerRequest();
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
.Where(t => t.Name.EndsWith("ViewModelValidator"))
.AsImplementedInterfaces()
.PropertiesAutowired();
// Etc etc etc
SourceSystemViewModel 目前很简单,看起来像这样:
public interface ISourceSystemViewModel
{
SourceSystem Value { get; }
}
public class SourceSystemViewModel : ISourceSystemViewModel
{
public SourceSystemViewModel(HttpRequestMessage request)
{
Value = request.Headers.GetSourceSystem();
}
public SourceSystem Value { get; }
}
GetSourceSystem 只是一个提取头部值的扩展方法。我已经尝试过注册SourceSystemViewModel 和不使用InstancePerRequest,但这并没有什么不同。当 autofac 尝试解析 ISourceSystemViewModal(最终是 HttpRequestMessage)时,它会抛出这个:
类型异常 'Autofac.Core.Registration.ComponentNotRegisteredException' 发生 在 Autofac.dll 中,但未在用户代码中处理
附加信息:请求的服务“System.Net.Http.HttpRequestMessage”尚未注册。避免 这个异常,要么注册一个组件来提供服务, 使用 IsRegistered() 检查服务注册,或使用 ResolveOptional() 方法来解决一个可选的依赖。
使用 autofac 3.5(webapi dll 引用为 autofac.webapi2 3.4)。
任何想法都非常感谢!
备注
我会在遇到任何发现时添加它们...
更新 1
我查看了RegisterHttpRequestMessage 的工作原理,它确实向HttpConfiguration 添加了一个名为CurrentRequestHandler 的消息处理程序。当我的请求进来时,我可以看到这个消息处理程序仍然存在。所以方法似乎做了它应该做的,它只是没有为我解决请求消息......
更新 2
我注意到,在控制器的上下文中,因此可以访问HttpRequestMessage,我可以解析这两个对象。像这样:
ILifetimeScope requestLifetimeScope = Request.GetDependencyScope().GetRequestLifetimeScope();
var h = requestLifetimeScope.Resolve<HttpRequestMessage>();
var sourceSystemViewModel = requestLifetimeScope.Resolve<ISourceSystemViewModel>();
更新 3
请务必注意,我正在手动尝试解析期望 HttpMessageRequest 作为注入参数的服务。例如,这对我来说失败了:
using (var httpRequestScope = IocProxy.Container.Context.BeginLifetimeScope("AutofacWebRequest"))
{
var sourceSystemViewModel = httpRequestScope.Resolve<ISourceSystemViewModel>();
}
【问题讨论】:
-
可能是您使用了不同的
HttpConfiguration(不是GlobalConfiguration.Configuration)? -
我不这么认为。我们还在全局配置上注册了一个自定义格式化程序,它没有任何问题。 Autofac 通常也可以正常工作。
-
您可以尝试调试并查看所有已注册的注册吗?如果你说如果消息处理程序存在并且已经被调用,那么应该有
HttpRequestMessage的注册。 -
我已经这样做了,并且在请求被触发后,消息处理程序仍在 HttpConfiguration 内的处理程序中。我从未说过它已被调用,但我注意到如果我在控制器中使用现有请求来生成 ILifetimeScope,我可以成功解析 HttpRequestMessage。我将发布问题更新以显示示例代码
-
所以,在你更新之后,我得到了一个问题:你在哪里尝试解决你的
ISourceSystemViewModel(当你遇到错误时)?我的意思是在哪个步骤/范围内。看起来您正试图在调用消息处理程序之前在某处解决此问题。 (如果您在控制器中调用它 - 肯定已经调用了处理程序)。
标签: c# asp.net-web-api asp.net-web-api2 autofac