【问题标题】:WebApi - Autofac cannot resolve parameter HttpRequestMessageWebApi - Autofac 无法解析参数 HttpRequestMessage
【发布时间】: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


【解决方案1】:

我遇到了同样的问题,基于 SO 我能够使用它

    public class NLoggerTraceWriterModule : Module
{

    private HttpConfiguration _config;

    public NLoggerTraceWriterModule(HttpConfiguration config)
    {
        this._config = config;
    }

    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterInstance(this._config).As<HttpConfiguration>();
        builder.Register(c =>
                           c.Resolve<HttpConfiguration>()
                            .Services
                            .GetService(typeof(ITraceWriter)) as ITraceWriter)
               .As<ITraceWriter>();
    }
}

将此模块注册为

// Call RegisterHttpRequestMessage to add the feature.
builder.RegisterHttpRequestMessage(config);
builder.RegisterModule(new Helper.Logging.NLoggerTraceWriterModule(config));

【讨论】:

  • 谢谢鲁弗斯。由于必须解决此问题,代码略有更改,但我打算一有机会就回来验证您的建议是否有效。
  • 对于延迟返回深表歉意。但我刚刚检查了您提供的解决方案并解决了问题。谢谢!
【解决方案2】:

尽管这不是 OP 的问题,但这是另一个解决方案,因为这是目前 "The requested service System.Net.Http.HttpRequestMessage' has not been registered." 的唯一 Google 结果

如果您创建了一个 HttpConfiguration 实例,请确保这是您传递给注册函数的内容。

在我的情况下,这是通过改变这个来解决的:

builder.RegisterHttpRequestMessage(GlobalConfiguration.Configuration);

到这里:

builder.RegisterHttpRequestMessage(Startup.HttpConfiguration);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    相关资源
    最近更新 更多