WCF channelfactory与配置文件中的设置?

时间:2016-11-18 15:05:01

标签: c# .net wcf

我有一个使用WCF的服务器和客户端解决方案。客户端将在运行时向服务询问有关活动服务器的URL,并且能够设置此项我使用ChannelFactory。但是,我仍然需要使用配置文件中的所有其他WCF设置。我就是这样做的:

var clientSection = ConfigurationManager.GetSection("system.serviceModel/client") as ClientSection;

            var address = string.Empty;
            for(int i = 0; i < clientSection.Endpoints.Count; i++)
            {
                if(clientSection.Endpoints[i].Name == endpointConfigurationName)
                {
                    var endpointAddress = new EndpointAddress(clientSection.Endpoints[i].Address.ToString());
                    var netHttpBinding = new NetHttpBinding(clientSection.Endpoints[i].BindingConfiguration);
                    var serviceEndpoint = new ServiceEndpoint(ContractDescription.GetContract(typeof(T)), netHttpBinding, endpointAddress);

                    var channelFactory = new ChannelFactory<T>(serviceEndpoint);

                    break;
                }
            }

问题是我得到了2个像这样的端点使用的BehaviorExtensions。

<services>
<endpoint binding="netHttpBinding" behaviorConfiguration="protoEndpointBehavior" address="BinaryHttpProto" bindingNamespace="http://MyApp.ServiceContracts/2007/11" contract="MyApp.ServiceContracts.IMyAppClientService" />
</services>

<behaviors>
<endpointBehaviors>
        <behavior name="protoEndpointBehavior">
          <protobuf />
        </behavior>
      </endpointBehaviors>
    </behaviors>

<extensions>
      <behaviorExtensions>
        <add name="protobuf" type="ProtoBuf.ServiceModel.ProtoBehaviorExtension, protobuf-net, Version=2.0.0.668, Culture=neutral, PublicKeyToken=257b51d87d2e4d67" />
      </behaviorExtensions>
    </extensions>

问题是我是如何从clientSection.Endpoints读取的?并将其设置在channelFactory上?我知道我可以像这样手动创建:

serviceEndpoint.EndpointBehaviors.Add(new ProtoEndpointBehavior());
            serviceEndpoint.EndpointBehaviors.Add(new CustomMessageInspectorBehavior());

但是这将是一个硬编码的静态,它将应用于所有端点,我需要能够从配置中更改它。

2 个答案:

答案 0 :(得分:0)

您不需要自己创建ChannelFactory。只需创建一个继承自ClientBase<T>的ClientService类。 ClientBase<T>的构造函数接受EndpointName并自动添加与此Endpoint关联的行为。 ClientBase<T>还允许您访问ChannelFactory<T>,您可以根据需要打开尽可能多的频道。您还需要做的唯一事情就是为要使用的配置中的每个EndPoint添加一个名称。

<endpoint binding="..." name="MyEndPoint" ... />

答案 1 :(得分:-1)

我想在代码中创建所有内容,混合解决方案并不好,不是在我使用大量自定义内容的情况下。