我有一个使用添加服务引用生成的WCF客户端,问题是该客户端的类将与其配置文件一起嵌入.msi(WIX项目)中。从msi,代理无法识别配置文件。我想在msi之外获取配置文件并告诉代理从那里读取它需要的东西。
有没有办法实现这个目标?告诉代理从另一个配置中获取它的数据而不是默认配置吗?
一些想法或一些例子会很棒。
谢谢, 阿德里安娜
答案 0 :(得分:0)
我们通过创建自定义ChannelFactory并覆盖CreateDescription方法来完成它。然后,您可以通过
创建代理var lProxy = (IClientChannel)mYourChannelFactory.CreateChannel();
lProxy.Open()
答案 1 :(得分:0)
我是这样做的: 从Vasu给我的链接,从示例中,我在我的项目中添加了CustomClientChannel。 我找到了2个bug: - 如果代理配置没有行为 - 如果在配置文件中有多个端点,每个端点都有其绑定,则无论端点如何,它始终都是第一个绑定。
修正如下:
//in CreateDescription() modify
if (serviceEndpoint.Binding == null)
{
serviceEndpoint.Binding = CreateBinding(selectedEndpoint.Binding, selectedEndpoint.BindingConfiguration, serviceModeGroup);
}
...
if (serviceEndpoint.Behaviors.Count == 0 && !String.IsNullOrEmpty(selectedEndpoint.BehaviorConfiguration))
{
AddBehaviors(selectedEndpoint.BehaviorConfiguration, serviceEndpoint, serviceModeGroup);
}
/// <summary>
/// Configures the binding for the selected endpoint
/// </summary>
/// <param name="bindingName"></param>
/// <param name="group"></param>
/// <returns></returns>
private Binding CreateBinding(string bindingName, string bindingConfiguration, ServiceModelSectionGroup group)
{
IBindingConfigurationElement be = null;
BindingCollectionElement bindingElementCollection = group.Bindings[bindingName];
if (bindingElementCollection.ConfiguredBindings.Count > 0)
{
foreach (IBindingConfigurationElement bindingElem in bindingElementCollection.ConfiguredBindings)
{
if (string.Compare(bindingElem.Name, bindingConfiguration) == 0)
{
be = bindingElem;
break;
}
}
Binding binding = null;
if (be != null)
{
binding = GetBinding(be);
be.ApplyConfiguration(binding);
}
return binding;
}
return null;
}