簡體   English   中英

WebApi-Autofac無法解析參數HttpRequestMessage

[英]WebApi - Autofac cannot resolve parameter HttpRequestMessage

我有一個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只是一種擴展方法,可以提取頭值。 我嘗試過使用InstancePerRequest和不使用InstancePerRequest注冊SourceSystemViewModel ,但這沒有什么不同。 當autofac嘗試解析ISourceSystemViewModal (並最終解析HttpRequestMessage )時,將拋出以下內容:

Autofac.dll中發生類型為'Autofac.Core.Registration.ComponentNotRegisteredException'的異常,但未在用戶代碼中處理

附加信息:所請求的服務'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>();
}

我有同樣的問題,並根據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));

即使這不是OP的問題,這還是另一種解決方案,因為這是目前Google唯一的結果, "The requested service System.Net.Http.HttpRequestMessage' has not been registered."

如果創建了HttpConfiguration實例,請確保將其傳遞給注冊功能。

就我而言,這可以通過更改以下方法解決:

builder.RegisterHttpRequestMessage(GlobalConfiguration.Configuration);

對此:

builder.RegisterHttpRequestMessage(Startup.HttpConfiguration);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM