首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Autofac - DelegatingHandler (HttpMessageHandler)注册

Autofac - DelegatingHandler (HttpMessageHandler)注册
EN

Stack Overflow用户
提问于 2015-06-15 12:50:01
回答 2查看 4.6K关注 0票数 4

类库中有一个自定义DelegatingHandler,需要向Autofac注册。webapi主机解析它对运行时的依赖,因此主机没有对这个库的引用。

代码语言:javascript
复制
public class LocalizationHandler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync( HttpRequestMessage request, CancellationToken cancellationToken )
    {}
}

在我的Autofac初始化器类中,我尝试了如下方法:

代码语言:javascript
复制
protected override void Load( ContainerBuilder builder )
{
     builder.RegisterType<LocalizationHandler>();
     builder.Register(c => new LocalizationHandler());
}

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

代码语言:javascript
复制
public static void Register(HttpConfiguration httpConfiguration)
{        
    httpConfiguration.MapHttpAttributeRoutes();          
    httpConfiguration.MessageHandlers.Add(new LocalizationHandler());
}

但我不能进入这里的主机项目。如何通过ContainerBuilder注入处理程序的任何想法

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-16 08:22:06

以下是我对延迟绑定的解决方案:

Global.asax

代码语言:javascript
复制
protected void Application_Start()
{
    List<DelegatingHandler> messageHandlers = GlobalConfiguration.Configuration.DependencyResolver.GetMessageHandlers();
    messageHandlers.ForEach(GlobalConfiguration.Configuration.MessageHandlers.Add);
}

辅助对象

代码语言:javascript
复制
public static class DependencyHelper
{
    public static List<DelegatingHandler> GetMessageHandlers(this IDependencyResolver dependencyResolver)
    {
        return dependencyResolver.GetServices(typeof (DelegatingHandler)).Cast<DelegatingHandler>().ToList();
    }
}

图书馆

代码语言:javascript
复制
protected override void Load(ContainerBuilder builder)
{
    builder.RegisterType<GlobalLocalizationHandler>().As<DelegatingHandler>();
}
票数 3
EN

Stack Overflow用户

发布于 2015-06-15 14:07:28

似乎您不能在Web中注入HttpMessageHandler

如果消息处理程序作为实例传递,并为整个服务初始化一次。我认为让用户代码自己注入依赖项并使用http配置注册实例比较容易。这允许人们编写具有构造函数但不需要依赖注入的自定义消息处理程序。目前的模式更为灵活。http://aspnetwebstack.codeplex.com/workitem/62

但是你可以创建一个代理来做你想做的事。例如:

代码语言:javascript
复制
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);
    }
}

然后像这样注册处理程序:

代码语言:javascript
复制
        builder.RegisterType<X1Handler>().As<DelegatingHandler>().InstancePerRequest();
        builder.RegisterType<X2Handler>().As<DelegatingHandler>().InstancePerRequest();

        config.MessageHandlers.Add(new ProxyDelegatingHandler());
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30845632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档