2016-05-03 3 views
0

У меня проблема с RegisterHttpRequestMessage, которая не работает для меня и не может понять, что я делаю неправильно. Это особенно важно, когда я пытаюсь вручную разрешить службу, которая принимает параметр HttpMessageRequest в качестве параметра.WebApi - Autofac не может разрешить параметр HttpRequestMessage

Я использую модули для регистрации компонентов в моем строителем, и в настоящее время мой модуль в главном веб-проекта выглядит следующим образом:

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() 10 для разрешения дополнительной зависимости.

Использование autofac 3.5 (webapi dll цитируется как autofac.webapi2 3.4).

Любые идеи высоко оценены!

Примечания

Я добавлю любые выводы, как я встречаю их ...

Update 1

я смотрел на то, как RegisterHttpRequestMessage работ и это действительно добавить обработчик сообщения CurrentRequestHandler - HttpConfiguration. Когда мой запрос приходит, я вижу, что этот обработчик сообщений все еще существует. Таким образом, метод кажется делать то, что он должен, это просто не разрешение сообщения запроса для меня ...

Update 2

Я заметил, что в то время как в контексте контроллера и, следовательно, имеют доступ к HttpRequestMessage Я могу решить оба объекта. Как это:

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

Update 3

Важно отметить, что я вручную пытаюсь решить сервис, который ожидает, что HttpMessageRequest в качестве закачиваемого параметра.Например, это не поможет мне:

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

ли возможно, вы используете другую 'HttpConfiguration' (а не' GlobalConfiguration.Configuration')? – MaKCbIMKo

+0

Я так не думаю. Мы также регистрируем пользовательский форматтер в Global Config, который не вызывает никаких проблем. Autofac вообще работает отлично. –

+0

Можете ли вы попробовать отладить и просмотреть все зарегистрированные регистрации? Если вы скажете, что если обработчик сообщений существует и был вызван, тогда должна быть регистрация для 'HttpRequestMessage'. – MaKCbIMKo

ответ

2

У меня была такая же проблема и на основе 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)); 
+0

Спасибо Rufus. Код немного изменился из-за необходимости обойти это, но я намерен вернуться к этому и проверить, работает ли ваше предложение, как только у меня появится шанс. –

+1

Извинения за массовую задержку. Но я только что проверил решение, которое вы предоставили, и устранил проблему. Спасибо! –

Смежные вопросы