0

約 10,000 行のデータを WCF サービスに送信する必要があり、WCF サービスはそれをデータベースに 1 つずつ挿入します。このプロセスには 1 時間以上かかります。しかし、運用開始から 1 時間が経過するとすぐに、何らかのタイムアウトが原因であると思われる Service not found 例外が発生します。ただし、Visual Studio 開発サーバーが実行されている限り、サービスはこのデータをデータベースに挿入し続けます。

クライアント側とサービス側の両方ですべてのタイムアウト値を 2 時間に設定しようとしましたが、役に立ちません。

サービスの web.config:

<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>

クライアント側(サービスクライアントの初期化中)

    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); 

サービスが操作全体を完了し、クライアントに応答を返すようにするには、どうすればよいか考えてください。また、この操作を行うためのより良い方法があると思われる場合はお知らせください。

4

2 に答える 2

1

あなたが試すことができるいくつかのオプションがあります:

  1. 別のスレッドで書き始めます。

このようにして、データが正常に受信されたことを知らせて、より迅速に応答できます。次に、データがまだ書き込まれているかどうかをサービスに問い合わせることができます。これまでにどれだけ書き込まれたかを応答することもできます。最後に、応答を得ることができます。

  1. 一度に少数のレコードのみを送信します。

このようにして、より迅速に対応し、進捗状況を示すことができます。

  1. 書き込みを最適化します。

たった 10000 件のレコードを書き込むのに 2 時間というのは膨大な時間です。おそらく、SqlBulkCopy を見て、それを DataTable と組み合わせる必要があります。これにより、速度が大幅に向上しますが、挿入にのみ使用できます。

1 と 2 を 3 と組み合わせることができます。

あなたの探求を頑張ってください。

于 2013-10-18T13:54:34.333 に答える
1

適切な時間内にアプリ サーバーに応答しなかったため、Web サービス エンドポイントが強制終了されたと思います。2 番目に気付くのは、Web サービス側で何かを 2 時間以上実行しているということです。まったく良い解決策ではありません。

保存する前にデータを処理する場合:

すべてのデータをDBのどこかに保存し、別のウォッチドッグまたは「ジョブ」または「キューマネージャー」プロセスを使用して、このジョブをバックグラウンドで実行することをお勧めします。

そうでない場合は、質問があります。

データの保存に 2 時間かかるのはなぜですか?

于 2013-10-18T13:55:08.040 に答える