我们有一个应用程序,将一个对象(在本例中为“ 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] Completed事件和[OperationName] Async方法。

  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基础结构接收到响应消息,就在线程上计划回调方法。更多信息,请参见http://msdn.microsoft.com/en-us/library/ms730059.aspx。

关于c# - WCF超时问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8839248/

10-11 15:52