我们有一个应用程序将一个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中,在服务器上执行此操作吗?
谢谢!
答案 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控件启动业务逻辑,这取决于所选择的操作,会导致超时。我实现了一个轮询方案,如下面的