【发布时间】:2019-12-16 21:51:26
【问题描述】:
我们在配置文件中配置的 WCF 绑定有一些奇怪的行为。 我们执行可能长时间运行的服务调用,因此我们需要比默认的 1 分钟更长的发送/操作超时。 我们的 WCF 配置反映了这一点,将 sendTimeout 设置为 10 分钟。
但是,如果服务调用超过 1 分钟,则会出现一条错误消息,指出操作在 1 分钟后超时。 调试这个我们检查配置是否正确,像这样(这里为了调试目的,服务调用少于1分钟):
public class MyWcfClient : ClientBase<IMyWcf>, IMyWcf
{
public ResultType MyMethod()
{
var originalBinding = base.Endpoint.Binding;
var result = this.Channel.MyMethod();
var changedBinding = base.Endpoint.Binding;
return result;
}
}
这里 originalBinding 将包含配置的设置(sendTimeout = 10 分钟等)。但调用后,检查 changedBinding 变量,绑定中还有其他值,其中 sendTimeout 为 1 分钟 并且似乎后一个是服务调用使用的一个,考虑到在进行长时间运行的调用时的超时响应。绑定的类型也从 NetTcpBinding 更改为 CustomBinding。
现在稍微修改一下代码:
public class MyWcfClient : ClientBase<IMyWcf>, IMyWcf
{
public void MyMethod()
{
var originalBinding = base.Endpoint.Binding;
var sendTimeout = ((IContextChannel)base.Channel).OperationTimeout;
var changedBinding = base.Endpoint.Binding;
}
}
在这里,当涉及到绑定值时,我们会得到与以前相同的行为。变量 sendTimeout 的值是 1 分钟,所以看起来更改后的绑定值再次被兑现。
第三个示例,在调用服务之前显式设置 OperationTimeout 是有效的。
public class MyWcfClient : ClientBase<IMyWcf>, IMyWcf
{
public ResultType MyMethod()
{
((IContextChannel)base.Channel).OperationTimeout = TimeSpan.FromMinutes(10);
var result = this.Channel.MyMethod();
return result;
}
}
在此进行长时间运行的服务调用(尽管少于 10 分钟)时,没有超时。
所以它可以在代码中显式设置超时,但我们希望在配置文件中完成所有操作。
绑定看起来与此类似(服务器端和客户端相同):
<binding name="NetTcpBinding"
sendTimeout="00:10:00"
receiveTimeout="00:10:00"
openTimeout="00:10:00"
closeTimeout="00:10:00"
transactionFlow="false"
portSharingEnabled="true"
maxReceivedMessageSize="2147483647"
maxBufferPoolSize="2147483647"
maxBufferSize="2147483647" >
...
</binding>
对此有何解释?我们可以做些什么来实现配置?
【问题讨论】:
标签: wcf configuration