不支持WCF配置
配置文件中配置的WCF绑定有一些奇怪的行为。 我们进行的服务调用可能是长时间运行的,因此我们需要发送/操作超时超过默认的1分钟。 我们的WCF配置反映了这一点,将sendTimeout设置为10分钟 但是,如果服务呼叫超过1分钟,则会显示一条错误消息,说明操作在1分钟标记处1分钟后超时。 调试我们检查配置是否正确,如下所示(为了调试,这里所做的服务调用少于1分钟):不支持WCF配置,wcf,configuration,Wcf,Configuration,配置文件中配置的WCF绑定有一些奇怪的行为。 我们进行的服务调用可能是长时间运行的,因此我们需要发送/操作超时超过默认的1分钟。 我们的WCF配置反映了这一点,将sendTimeout设置为10分钟 但是,如果服务呼叫超过1分钟,则会显示一条错误消息,说明操作在1分钟标记处1分钟后超时。 调试我们检查配置是否正确,如下所示(为了调试,这里所做的服务调用少于1分钟): 公共类MyWcfClient:ClientBase,IMyWcf { 公共结果类型MyMethod() { var origina
公共类MyWcfClient:ClientBase,IMyWcf
{
公共结果类型MyMethod()
{
var originalBinding=base.Endpoint.Binding;
var result=this.Channel.MyMethod();
var changedBinding=base.Endpoint.Binding;
返回结果;
}
}
此处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;
}
}
公共类MyWcfClient:ClientBase,IMyWcf
{
公共方法()
{
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;
}
}
公共类MyWcfClient:ClientBase,IMyWcf
{
公共结果类型MyMethod()
{
((IContextChannel)base.Channel).OperationTimeout=TimeSpan.FromMinutes(10);
var result=this.Channel.MyMethod();
返回结果;
}
}
在这里,当进行长时间运行的服务呼叫时(虽然不到10分钟),没有超时
因此,它可以在代码中显式设置超时,但我们希望在配置文件中完成这一切
绑定与此类似(在服务器端和客户端上相同):
...
对此有何解释?我们可以做些什么来维护配置?原来这是遥测客户端Wcf扩展中的一个错误。没有它,绑定将被保留,超时将正常工作
这是遥测客户端Wcf扩展中的一个错误。没有它,绑定将被保留,超时将正常工作
public class MyWcfClient : ClientBase<IMyWcf>, IMyWcf
{
public ResultType MyMethod()
{
((IContextChannel)base.Channel).OperationTimeout = TimeSpan.FromMinutes(10);
var result = this.Channel.MyMethod();
return result;
}
}
<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>