Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF超时问题_C#_Wcf - Fatal编程技术网

C# WCF超时问题

C# WCF超时问题,c#,wcf,C#,Wcf,我们有一个应用程序,它向服务发送一个对象,在本例中是printJob。根据我们的交易量,这个过程可能需要一段时间。一旦服务完成它所做的事情,它就会向应用程序返回一个PrintJobID PrintGatewayClient printClient = new PrintGatewayClient(); PrintService.ServiceJob printJob = new PrintService.ServiceJob(); printJob.ServicePrintItems = che

我们有一个应用程序,它向服务发送一个对象,在本例中是printJob。根据我们的交易量,这个过程可能需要一段时间。一旦服务完成它所做的事情,它就会向应用程序返回一个PrintJobID

PrintGatewayClient printClient = new PrintGatewayClient();
PrintService.ServiceJob printJob = new PrintService.ServiceJob();
printJob.ServicePrintItems = checkList.ToArray();

try
{
    currentBatch.PrintJobID = printClient.SubmitPrintJob(printJob);
    PaymentBatchesGateway.Update(currentBatch);
}
catch (System.Exception ex)
{
    throw ex;
}

printClient.Close();
应用程序等待并等待printClient完成其作业并接收PrintJobID的整数,然后使用该ID更新表。但是,当运行大批量时,我们会出现以下错误:

The request channel timed out while waiting for a reply after 00:04:59.9062464. Increase the timeout value passed to the call to Request or increase the SendTimeout value on the Binding. The time allotted to this operation may have been a portion of a longer timeout.
我在netTcpBinding上查看了我们的web.config文件:

<netTcpBinding>
    <binding name="NetTcpBinding_IPrintGateway" closeTimeout="00:01:00"
       openTimeout="00:01:00" receiveTimeout="02:00:00" sendTimeout="02:00:00"
       transactionFlow="false" transferMode="Buffered"
       transactionProtocol="OleTransactions"
       hostNameComparisonMode="StrongWildcard" listenBacklog="10"
       maxBufferPoolSize="524288" maxBufferSize="50000000" maxConnections="10"
       maxReceivedMessageSize="50000000">

    <readerQuotas maxDepth="5000" maxStringContentLength="150000"
       maxArrayLength="16384" maxBytesPerRead="50000000" 
       maxNameTableCharCount="16384" />

    <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
    <security mode="None">
            <transport clientCredentialType="None" protectionLevel="None" />
            <message clientCredentialType="None" />
    </security>
    </binding>
<netTcpBinding>

<client>
    <endpoint address="http://server/printgateway/PrintGateway.svc"
        binding="basicHttpBinding"
        bindingConfiguration="BasicHttpBinding_IPrintGateway"
        contract="PrintService.IPrintGateway" 
        name="BasicHttpBinding_IPrintGateway" />    
</client>
我在代码中的任何地方都找不到00:05:00以外的时间。谁能解释一下,告诉我如何延长这段时间。我可以在服务器上的web.config中的代码中执行此操作吗


谢谢大家!

让服务调用上的线程块等待响应甚至60秒都是多余的,这代表了糟糕的设计选择。你当然不想把时间增加到5分钟,如果是5分钟,为什么不是一个小时?这不是一个现实的或可支持的解决方案

您最好改用异步服务调用

在向项目添加服务引用时,在“添加服务引用”对话框中,单击“高级”,然后在“客户端”下选择“生成异步操作”。由此生成的代理类将具有[OperationName]已完成事件和[OperationName]异步方法,用于服务协定中的每个OperationName

  var client = new Service1Client();
  client.GetDataCompleted += Client_GetDataCompleted; // specify the callback method
  client.GetDataAsync( 0 );
  // ...


static void Client_GetDataCompleted( object sender, GetDataCompletedEventArgs e )
{
  var response = e.Result;
  // ...
}

一旦WCF基础设施接收到响应消息,回调方法就被安排在线程上。更多关于如何:异步调用WCF服务操作的信息。

有两个配置文件,一个在服务端,另一个在使用者端。看起来你有消费者配置。您可能会在服务conifg中找到设置的5分钟超时

然而,我同意VisualStuart的观点,同步服务调用的长时间等待是不可取的。应该发生的是,打印作业被添加到队列中,并且在处理它们之后,可以向调用的使用者发送响应


然而,这将意味着大量的重新开发工作。

对于启动业务逻辑的Silverlight控件,我们也遇到了类似的情况,这取决于所选择的操作,将导致超时。我实现了如下的轮询场景

使用StartOperation调用WCF服务方法,该方法将唯一ID返回给使用者。 服务方法启动一个后台进程,该进程执行该工作并简单地报告一个状态。 使用者使用唯一ID调用单独的wcf服务状态方法以获取状态。 Status方法检查我使用的一个单例管理器的后台进程,该管理器在查找字典中有正在运行的进程,并返回其状态。 消费者呼叫3,直到报告完成。 singleton manager可以在报告完成后清理流程和/或允许使用者报告其完成并将其清理。
我对WCF不是特别了解,我也不知道5分钟的超时是从哪里来的。但是,对于测试,您是否尝试将中的closeTimeout、openTimeout、receiveTimeout和sendTimeout值增加到更高的值,并查看ExpException是否仍然发生?我还相信您可以创建一个合适的绑定对象,设置binding.SendTimeout=TimeSpan.FromMinutes60;以及代码中的其他超时值,并在创建服务客户端时使用该对象。不幸的是,我从另一个离开公司的开发人员那里继承了该应用程序。我只是支持这个应用。您能解释一下异步服务调用是什么意思吗?Wcf不会阻塞,因为单个实例为客户端服务的时间过长。默认行为是生成另一个实例来服务新请求。但是,虽然异步服务可能是个好主意,但它不能解决超时问题,因为服务器仍然需要执行其工作,因此解决性能问题可能是一个更好的主意。如果服务器处理大型数据传输或类似的任务预期会长期运行,则提高超时时间也可以。@faester,您认为每次调用实例是WCF中服务的默认实例模型是正确的。这里显示的代码是客户机代码。要阻止的是客户机,而不是服务。某些服务操作(如业务流程操作)可能需要很长的时间才能完成并返回响应消息。客户端选择同步调用服务,线程阻塞等待响应,或异步线程不阻塞等待响应。@Turp,我已经用开始异步服务调用的信息更新了答案。@Visual Stuart:很抱歉,如果任何操作需要的时间超过几毫秒,那么客户端应该是异步的,这是绝对正确的。