WCF超时问题

时间:2012-01-12 17:14:06

标签: c# wcf

我们有一个应用程序将一个Object(在本例中为“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();

appliation等待并等待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中,在服务器上执行此操作吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

在服务调用上等待响应甚至60秒的线程块过多并且表示设计选择不佳。你当然不想把这个增加到5分钟,如果5分钟,为什么不一个小时呢?这不是一个现实的或可支持的解决方案。

相反,使用异步服务调用会好得多。

当您将服务引用添加到项目时,在Add Service Reference对话框中,单击Advanced并在Client下选择“Generate asynchronous operations”。从此生成的代理类将具有[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服务操作”http://msdn.microsoft.com/en-us/library/ms730059.aspx

答案 1 :(得分:1)

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

但是,我同意Visual Stuart长时间等待同步服务呼叫是不可取的。应该发生的是将打印作业添加到队列中,在处理完成后,可以将响应发送给调用消费者。

然而,这将代表重大的重建工作。

答案 2 :(得分:1)

我们遇到类似的情况,Silverlight控件启动业务逻辑,这取决于所选择的操作,会导致超时。我实现了一个轮询方案,如下面的

  1. 使用StartOperation调用的WCF服务方法,该方法向使用者返回唯一ID。
  2. 服务方法启动后台进程,该进程执行工作并简单地报告状态。
  3. 消费者使用唯一ID调用单独的wcf服务状态方法以获取状态。
  4. 状态方法检查后台进程(我使用了一个在查询字典中有正在运行的进程的单例管理器)并返回其状态。
  5. 消费者在报告完成之前调用#3。
  6. 单身经理可以在报告完成后清理流程和/或允许消费者报告其完成情况并将其清理干净。