gpt4 book ai didi

c# - WebApi - Autofac 无法解析参数 HttpRequestMessage

转载 作者:行者123 更新时间:2023-11-30 20:36:23 25 4
gpt4 key购买 nike

我有一个问题,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 只是一种提取 header 值的扩展方法。我已经尝试过使用和不使用 InstancePerRequest 注册 SourceSystemViewModel 但这没有什么区别。当 autofac 尝试解析 ISourceSystemViewModal(最终是 HttpRequestMessage)时,它会抛出这个:

An exception of type 'Autofac.Core.Registration.ComponentNotRegisteredException' occurred in Autofac.dll but was not handled in user code

Additional information: The requested service 'System.Net.Http.HttpRequestMessage' has not been registered. To avoid this exception, either register a component to provide the service, check for service registration using IsRegistered(), or use the ResolveOptional() method to resolve an optional dependency.

使用 autofac 3.5(webapi dll 引用为 autofac.webapi2 3.4)。

非常感谢任何想法!

注意事项

我会在遇到任何发现时添加...

更新 1

我查看了 RegisterHttpRequestMessage 的工作原理,它确实向 HttpConfiguration 添加了一个名为 CurrentRequestHandler 的消息处理程序。当我收到请求时,我可以看到这个消息处理程序仍然存在。所以方法似乎做了它应该做的事,它只是没有为我解析请求消息...

更新 2

我注意到,在 Controller 的上下文中,因此可以访问 HttpRequestMessage,我可以解析这两个对象。像这样:

ILifetimeScope requestLifetimeScope = Request.GetDependencyScope().GetRequestLifetimeScope();
var h = requestLifetimeScope.Resolve<HttpRequestMessage>();
var sourceSystemViewModel = requestLifetimeScope.Resolve<ISourceSystemViewModel>();

更新 3

重要的是要注意,我正在手动尝试解析期望 HttpMessageRequest 作为注入(inject)参数的服务。例如,这对我来说失败了:

using (var httpRequestScope = IocProxy.Container.Context.BeginLifetimeScope("AutofacWebRequest"))
{
var sourceSystemViewModel = httpRequestScope.Resolve<ISourceSystemViewModel>();
}

最佳答案

我有同样的问题,基于 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));

关于c# - WebApi - Autofac 无法解析参数 HttpRequestMessage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37004405/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com