У меня проблема с 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>();
}
ли возможно, вы используете другую 'HttpConfiguration' (а не' GlobalConfiguration.Configuration')? – MaKCbIMKo
Я так не думаю. Мы также регистрируем пользовательский форматтер в Global Config, который не вызывает никаких проблем. Autofac вообще работает отлично. –
Можете ли вы попробовать отладить и просмотреть все зарегистрированные регистрации? Если вы скажете, что если обработчик сообщений существует и был вызван, тогда должна быть регистрация для 'HttpRequestMessage'. – MaKCbIMKo