我们要求在从客户端代理向我们的每个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通道端点添加行为,直到请求实际来自客户端代理?
答案 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();
});
我希望有所帮助。