我在Google上搜索了很多东西,似乎没有一个答案可以回答我的问题,希望它不会重复。
我正在开发一项服务,我不想完全重建并保持原样,而只是将交易的一部分落实到其中。
有一个服务具有由autofac创建的wcf网关的实例,它是一个SingleInstance(),例如:
public static void RegisterMyService(ContainerBuilder builder)
{
builder.Register(c => new DesiredGatewayInterceptor());
builder
.Register(
c =>
{
const string BindingName = "BasicHttpBinding_My_PortType";
Uri endpointAddress = null;
ClientSection servicesSection = (ClientSection)WebConfigurationManager.GetSection("system.serviceModel/client");
foreach (ChannelEndpointElement endpoint in servicesSection.Endpoints)
{
if (endpoint.Name == BindingName)
{
endpointAddress = endpoint.Address;
break;
}
}
ChannelFactory<DesiredGateway> channel = new ChannelFactory<DesiredGateway>(
new BasicHttpBinding(BindingName),
new EndpointAddress(endpointAddress));
NameValueCollection section = (NameValueCollection)ConfigurationManager.GetSection("CredentialsConfiguration");
channel.Credentials.UserName.UserName = section["DesiredGatewayUser"];
channel.Credentials.UserName.Password = section["DesiredGatewayPassword"];
return channel;
})
.SingleInstance();
builder
.Register(c => c.Resolve<ChannelFactory<DesiredGateway>>().CreateChannel())
.InterceptTransparentProxy(typeof(DesiredGateway))
.InterceptedBy(typeof(DesiredGatewayInterceptor))
.UseWcfSafeRelease();
}
我已经了解了用于操作标头的OperationContextScope(),但是由于此网关实例是由autofac注册的,因此我无法正确地转换为IContextChannel。
using (OperationContextScope scope = new OperationContextScope((IContextChannel)desiredGateway))
{
// Do some stuff with headers now
}
这样的转换给了我一个例外,因为desireGateway的实例被包装在某种容器中,该容器不是IContextChannel,但是一旦我使用channel.CreateChannel()创建了自己的desireGateway的实例,我就可以将其转换为IContextChannel。
目标是能够在每次调用desirableGateway时注入一个头值,是否有任何方法可以实现此目的而又无需过多重建现有实现?也许存在一种更清洁的方法来实现上述目标?
答案 0 :(得分:0)
所以我最终从网关注册中删除了这些行:
.InterceptTransparentProxy(typeof(DesiredGateway))
.InterceptedBy(typeof(DesiredGatewayInterceptor))
这允许我然后将其强制转换为IContextChannel,并使用通用方法在拥有网关实例的类中实现了跨段处理。