如何防止从Silverlight客户端调用WCF服务超时

时间:2013-10-18 13:38:23

标签: c# performance wcf silverlight

我需要向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); 

请介绍一下我应该尝试什么,以便服务完成整个操作并向客户端发回响应。 另外,如果您认为有更好的方法来执行此操作,请与我们联系。

2 个答案:

答案 0 :(得分:1)

您可以尝试一些选项:

  1. 在另一个主题中开始写作。
  2. 通过这种方式,您可以更快地响应,并告知数据已成功接收。 然后,您可以询问服务是否已经写入数据 - 您甚至可以回答到目前为止已写入的数据。 最后你可以得到答复。

    1. 一次只发送几条记录。
    2. 通过这种方式,您可以更快地做出响应并显示进度。

      1. 优化写作。
      2. 两小时是写入10000条记录的大量时间。 也许你应该看看SqlBulkCopy并将它与DataTable结合起来,这可以提高速度,但只能用于插入。

        您可以将1和2与3号组合。

        祝你好运。

答案 1 :(得分:1)

我认为您的网络服务端点被杀了,因为它没有在合理的时间内响应应用服务器。我要注意的第二件事是,你在网络服务方面做了两个多小时。根本不是好的解决方案。

如果您在保存之前处理数据:

我认为您将所有数据存储在数据库中,并拥有另一个Watchdog或“Job”或“Queue manager”Proess,以便在后台完成这项工作。

如果不是这种情况,那么我有一个问题:

为什么需要2个小时才能保存数据?