Autofac - DelegatingHandler (HttpMessageHandler) 注册

Autofac - DelegatingHandler (HttpMessageHandler) Registration

我在 class 库中有一个自定义 DelegatingHandler,我需要在 Autofac 中注册。 webapi 宿主解决了它对运行时的依赖,因此宿主没有引用这个库。

public class LocalizationHandler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync( HttpRequestMessage request, CancellationToken cancellationToken )
    {}
}

在我的 Autofac 初始化器上 class 我试过类似的东西:

protected override void Load( ContainerBuilder builder )
{
     builder.RegisterType<LocalizationHandler>();
     builder.Register(c => new LocalizationHandler());
}

在主机中注册此类处理程序的正常方法是:

public static void Register(HttpConfiguration httpConfiguration)
{        
    httpConfiguration.MapHttpAttributeRoutes();          
    httpConfiguration.MessageHandlers.Add(new LocalizationHandler());
}

但我无权访问此处的宿主项目。关于如何通过 ContainerBuilder 注入处理程序的任何想法?

似乎无法在 Web API

中注入 HttpMessageHandler

Given the message handler is passed as instance and being initialized once for the entire service. I think it is easier to have user code inject the dependency themselves first and register the instance with http configuration. This allow people to write custom message handler that has constructor but do not need dependency injection as well. The current model is more flexible.

>> http://aspnetwebstack.codeplex.com/workitem/62

但是您可以创建代理来执行您想要的操作。例如:

public class ProxyDelegatingHandler : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, CancellationToken cancellationToken)
    {
        IEnumerable<DelegatingHandler> innerHandlers = 
            request.GetDependencyScope()
                   .GetServices(typeof(DelegatingHandler))
                   .OfType<DelegatingHandler>();

        HttpMessageHandler handler = this.InnerHandler;
        foreach (DelegatingHandler innerHandler in innerHandlers)
        {
            innerHandler.InnerHandler = handler;
            handler = innerHandler;
        }

        HttpMessageInvoker invoker = new HttpMessageInvoker(handler, false);
        return invoker.SendAsync(request, cancellationToken);
    }
}

并像这样注册您的处理程序:

        builder.RegisterType<X1Handler>().As<DelegatingHandler>().InstancePerRequest();
        builder.RegisterType<X2Handler>().As<DelegatingHandler>().InstancePerRequest();

        config.MessageHandlers.Add(new ProxyDelegatingHandler());

这是我的延迟绑定解决方案:

Global.asax

protected void Application_Start()
{
    List<DelegatingHandler> messageHandlers = GlobalConfiguration.Configuration.DependencyResolver.GetMessageHandlers();
    messageHandlers.ForEach(GlobalConfiguration.Configuration.MessageHandlers.Add);
}

帮手

public static class DependencyHelper
{
    public static List<DelegatingHandler> GetMessageHandlers(this IDependencyResolver dependencyResolver)
    {
        return dependencyResolver.GetServices(typeof (DelegatingHandler)).Cast<DelegatingHandler>().ToList();
    }
}

图书馆

protected override void Load(ContainerBuilder builder)
{
    builder.RegisterType<GlobalLocalizationHandler>().As<DelegatingHandler>();
}