我们有一个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自动获取这些默认值?
(注意:我知道我可以为绑定指定一个名称并在代码中使用它,这是我目前正在追求的选项,但由于各种技术原因,我和#我宁愿不要这样做。)
答案 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);
您可以重构上述内容,以便您可以通过代码生成任意数量的绑定配置(例如,每个绑定配置一个方法)。