我需要向WCF服务发送大约10,000行数据,然后WCF服务逐个将其插入数据库。这个过程需要1个多小时。但是,一旦从操作开始完成1小时,我就会得到一个未发现的服务异常,我相信这是因为有一段时间了。 但是,只要visual studio开发服务器继续运行,服务就会继续将此数据插入数据库。
我已经尝试在客户端和服务端将所有超时值设置为2小时,但它没有帮助。
web.config for service:
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IDService" allowCookies="true" maxBufferPoolSize="2147483647"
maxReceivedMessageSize="2147483647" closeTimeout="02:00:00"
openTimeout="02:00:00" receiveTimeout="02:00:00" sendTimeout="02:00:00">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
maxArrayLength="2147483647" maxBytesPerRead="2147483647"
maxNameTableCharCount="2147483647"/>
<security mode="None"/>
</binding>
</basicHttpBinding>
</bindings>
在客户端(初始化serviceclient时)
this.binding.ReceiveTimeout = TimeSpan.FromHours(2);
this.binding.OpenTimeout = TimeSpan.FromHours(2);
this.binding.SendTimeout = TimeSpan.FromHours(2);
this.binding.CloseTimeout = TimeSpan.FromHours(2);
this.binding.MaxBufferSize = int.MaxValue;
this.binding.MaxReceivedMessageSize = int.MaxValue;
我做了一些搜索,并且在许多地方建议增加OperationTimeout。所以我尝试了但没有任何成功。
((IContextChannel)base.Channel).OperationTimeout = new TimeSpan(2, 0, 0);
请介绍一下我应该尝试什么,以便服务完成整个操作并向客户端发回响应。 另外,如果您认为有更好的方法来执行此操作,请与我们联系。
答案 0 :(得分:1)
您可以尝试一些选项:
通过这种方式,您可以更快地响应,并告知数据已成功接收。 然后,您可以询问服务是否已经写入数据 - 您甚至可以回答到目前为止已写入的数据。 最后你可以得到答复。
通过这种方式,您可以更快地做出响应并显示进度。
两小时是写入10000条记录的大量时间。 也许你应该看看SqlBulkCopy并将它与DataTable结合起来,这可以提高速度,但只能用于插入。
您可以将1和2与3号组合。
祝你好运。
答案 1 :(得分:1)
我认为您的网络服务端点被杀了,因为它没有在合理的时间内响应应用服务器。我要注意的第二件事是,你在网络服务方面做了两个多小时。根本不是好的解决方案。
如果您在保存之前处理数据:
我认为您将所有数据存储在数据库中,并拥有另一个Watchdog或“Job”或“Queue manager”Proess,以便在后台完成这项工作。
如果不是这种情况,那么我有一个问题:
为什么需要2个小时才能保存数据?