为代理设置另一个配置文件

时间:2009-06-11 19:10:22

标签: c# wcf configuration

我有一个使用添加服务引用生成的WCF客户端,问题是该客户端的类将与其配置文件一起嵌入.msi(WIX项目)中。从msi,代理无法识别配置文件。我想在msi之外获取配置文件并告诉代理从那里读取它需要的东西。

有没有办法实现这个目标?告诉代理从另一个配置中获取它的数据而不是默认配置吗?

一些想法或一些例子会很棒。

谢谢, 阿德里安娜

2 个答案:

答案 0 :(得分:0)

我们通过创建自定义ChannelFactory并覆盖CreateDescription方法来完成它。然后,您可以通过

创建代理
var lProxy = (IClientChannel)mYourChannelFactory.CreateChannel();
lProxy.Open()

查看http://weblogs.asp.net/cibrax/archive/2007/10/19/loading-the-wcf-configuration-from-different-files-on-the-client-side.aspx

答案 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;

       }