在Autofac服务注册期间修改WCF端点行为

时间:2014-01-10 15:03:32

标签: c# wcf cookies autofac

我们要求在从客户端代理向我们的每个WCF服务方法发出请求时发送身份验证cookie。创建cookie的代码工作正常但我正在尝试修改Autofac服务注册代码以添加新的端点行为,该行为将cookie添加到请求标头。我正在使用Fiddler作为代理来查看cookie是否已添加到请求中。

这是我到目前为止所做的,但不起作用:

private static void RegisterService<TService>(ContainerBuilder builder) 
{ 
    builder.Register(c => new ChannelFactory<TService>(string.Format("BasicHttpBinding_{0}", typeof(TService).Name))).SingleInstance();  

    builder.Register(c => 
    { 
        var channel = c.Resolve<ChannelFactory<TService>>(); 
        if (!channel.Endpoint.Behaviors.Contains(typeof(SamsTrustBehaviour))) 
        { 
            channel.Endpoint.Behaviors.Add(new SamsTrustBehaviour()); 
        } 

        return channel.CreateChannel(); 
    }).UseWcfSafeRelease(); 
}

我可以将依赖项传递给我的客户端代理代码,并调用一个方法,在每个请求发出时将SamsTrustBehaviour添加到端点,并且工作正常。但理想情况下,我更愿意在注册时这样做。这是有效的代码,最初在每次请求服务时调用:

public void AttachSamsToken<T>(T serviceInterface) where T : class
{
    var clientBase = serviceInterface as ClientBase<T>;
    if (clientBase != null && !clientBase.Endpoint.Behaviors.Contains(typeof(SamsTrustBehaviour)))
    {
        clientBase.Endpoint.Behaviors.Add(new SamsTrustBehaviour());
    }
}

因此,添加到ClientBase<T>.Endpoint似乎有效,而添加到ChannelFactory<T>.Endpoint却没有。

是否有办法在注册期间向WCF通道端点添加行为,直到请求实际来自客户端代理?

1 个答案:

答案 0 :(得分:3)

我最近遇到了同样的问题。以下是我使用的基于this AutoFac文档的解决方案。

        containerBuilder.Register(s =>
        {
            var factory = s.Resolve<ChannelFactory<IService>>();
            factory.Opening +=
                (sender, args) =>
                    factory.Endpoint.Behaviors.Add(new SamsTrustBehaviour());
            return factory.CreateChannel();
        });

我希望有所帮助。