对于在配置文件中配置的WCF绑定,我们有一些奇怪的行为。 我们进行的服务呼叫可能会长时间运行,因此我们需要的发送/操作超时时间超过默认的1分钟。 我们的WCF配置反映了这一点,将sendTimeout设置为10分钟。
但是,如果服务呼叫超过1分钟,则会显示一条错误消息,提示操作在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>
对此有任何想法的解释吗?我们该怎么做才能兑现配置?
答案 0 :(得分:0)
结果证明这是TelemetryClient Wcf扩展名中的错误。没有它,绑定将保留,并且超时有效。
https://github.com/Microsoft/ApplicationInsights-SDK-Labs/issues/124