通过配置文件更改运行时构造的WCF绑定的默认值

时间:2014-12-09 17:45:33

标签: c# wcf wcf-binding

我们有一个WCF客户端应用程序,它与一系列不同的服务端点进行通信,这些服务端点都暴露了相同的合同(基本上是不同后端的代理服务)。因为我们在运行时之前不知道端点URL,所以我们动态创建服务代理类,如下所示:

public Factory()
{
    this.ProxyFactory = new ChannelFactory<IProxyServiceChannel>(new BasicHttpBinding());
}

public IProxyServiceChannel GetProxy(Uri uri)
{
    return this.ProxyFactory.CreateChannel(new EndpointAddress(uri));
}

这种方法很好,除非在某些情况下代理发送的数据大于64k的默认最大接收方数。通常,我们只需进入配置文件并更改基本HTTP绑定以允许更大的消息。对于WCF 4.0及更高版本,我们通常在默认(未命名)绑定上执行此操作,如下所示:

        <basicHttpBinding>
            <binding maxReceivedMessageSize="2147483647" 
                     sendTimeout="00:10:00" 
                     receiveTimeout="00:10:00">
                <readerQuotas maxArrayLength="2147483647" />
            </binding>
        </basicHttpBinding>

更改此类默认绑定设置适用于我们在应用程序中主机的任何服务,以及通过&#34;新服务参考创建的任何服务代理......&# 34 ;.但由于某些原因,我们向渠道工厂提供的new BasicHttpBinding()对象未获取这些设置,并且正在回退到内置默认值。

我曾假设这些绑定设置适用于使用BasicHttpBinding的任何端点,而{{1}}没有指定更具体的绑定配置。那是对的吗?如果没有,有没有办法让WCF自动获取这些默认值?

注意:我知道我可以为绑定指定一个名称并在代码中使用它,这是我目前正在追求的选项,但由于各种技术原因,我和#我宁愿不要这样做。)

1 个答案:

答案 0 :(得分:1)

new BasicHttpBinding()将为您提供具有默认值的BasicHttpBinding实例 - 除非通过配置节名称,否则我认为它不会从配置文件中读取任何内容(即使是默认配置) in(这对配置文件中定义的默认绑定没有帮助)。您要做的是创建实例并将其传递给ChannelFactory。像这样:

BasicHttpBinding binding = new BasicHttpBinding();
binding.MaxReceivedMessageSize = Int32.Max;
binding.SendTimeOut = new Timespan();
binding.ReceiveTimeout = new TimeSpan();

XmlDictionaryReaderQuotas quotas = new XmlDictionaryReaderQuotas();
quotas.MaxArrayLength = Int32.Max;

binding.ReaderQuotas = quotas;

this.ProxyFactory = new ChannelFactory<IProxyServiceChannel>(binding);

您可以重构上述内容,以便您可以通过代码生成任意数量的绑定配置(例如,每个绑定配置一个方法)。