不接受WCF配置

时间:2019-08-09 07:21:47

标签: wcf configuration

对于在配置文件中配置的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>

对此有任何想法的解释吗?我们该怎么做才能兑现配置?

1 个答案:

答案 0 :(得分:0)

结果证明这是TelemetryClient Wcf扩展名中的错误。没有它,绑定将保留,并且超时有效。

https://github.com/Microsoft/ApplicationInsights-SDK-Labs/issues/124