2012-01-12 31 views
2

オブジェクト(この場合は "printJob")をサービスに送信するアプリケーションがあります。私たちが持っている取引の量によっては、このプロセスにしばらく時間がかかることがあります。サービスが何をしたら、アプリケーションに "PrintJobID"を返します。WCFタイムアウト問題

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を使用してテーブルを更新します。私はnetTcpBindingで私たちのweb.configファイルを見てきました

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. 

::私は00のアウトの時間を見つけることができませんでした

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

大きなバッチが実行されている場合しかし、我々は次のエラーを取得します:05:00コードのどこにいても。誰でもこの時間を延長する方法を説明して教えてください。サーバー上のweb.configのコードでこれを行うことはできますか?

ありがとうございました!

+0

私は特にWCFに精通していないので、その5分のタイムアウトがどこから来ているのかわかりません。しかし、テストのために、のcloseTimeout、openTimeout、receiveTimeout、およびsendTimeoutの値をもっと上げようとしましたが、例外がまだ発生しているかどうかを確認しましたか?私はまたあなたが適切なバインディングオブジェクトを作成することができると信じて、binding.SendTimeout = TimeSpan.FromMinutes(60); (他のタイムアウト値と同様に)をコード内で使用し、サービスクライアントの作成時にそのオブジェクトを使用します。 – Dan

答えて

1

60秒間の応答を待っているサービスコール上のスレッドブロックを持つことは過度であり、設計上の選択肢が悪いことを表しています。あなたは確かにこれを5分に増やしたいとは思わないし、5分だったら1時間じゃないの?これは現実的またはサポート可能な解決策ではありません。

代わりに非同期サービスコールを使用するほうがはるかに良いでしょう。

サービス参照をプロジェクトに追加するには、[サービス参照の追加]ダイアログで[詳細設定]をクリックし、[クライアント]で[非同期操作の生成]を選択します。これから生成されたプロキシクラスは、[OperationName]完了イベントと、[OperationName] Asyncメソッドをサービス契約の各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を参照してください。

+0

残念ながら、私は会社を辞めた他の開発者からアプリケーションを継承しました。私はちょうどアプリのサポートです。 「非同期サービスコール」の意味を説明できますか? – Turp

+0

Wcfは、1つのインスタンスがクライアントに過度の時間を提供しているため、ブロックされません。デフォルトの動作は、別のインスタンスを生成して新しい要求を処理することです。しかし、非同期サービスは良いアイデアだと言われています。サーバがまだ作業を行う必要があるので、タイムアウトの問題は解決しません。そのため、パフォーマンスの問題を解決するのがより良い考えです。サーバが大量のデータ転送を処理したり、長時間実行されると予想される同様のタスクを処理する場合は、タイムアウトを上げることもOKです。 – faester

+0

@faester、instance-per-callがサービスのWCFのデフォルトインスタンスモデルであることは間違いありません。ここに示すコードはクライアントコードです。サービスではなくブロックするクライアントです。ビジネスプロセス操作のような特定のサービス操作は、応答メッセージを完了して返すために非常に長い時間(数時間、数週間)かかることがあります。クライアントは、サービスを同期して呼び出すか(応答を待っているスレッドブロック)、非同期に(スレッドが応答の待機をブロックしない)かを選択します。 –

1

サービスファイルには2つ、消費者側には1つの設定ファイルがあります。あなたは消費者設定を持っているようです。あなたはおそらくサービスのconifgで5分のタイムアウトセットを見つけるでしょう。

しかし、私はビジュアルスチュアートに同意すると、同期サービスコールで長い時間待つことは望ましくありません。印刷ジョブがキューに追加され、処理された後、応答が呼び出し元のコンシューマに送信されることがあります。

しかし、これは大幅な再開発努力を意味します。

1

ビジネスロジックを開始するSilverlightコントロールでは、選択した操作によってはタイムアウトが発生する可能性があります。次のようなポーリングシナリオを実装しました

  1. StartOperationで呼び出され、消費者に一意のIDを返したWCFサービスメソッド。
  2. サービスメソッドは、作業を行い、単にステータスを報告するバックグラウンドプロセスを開始します。
  3. コンシューマは、ステータスを取得するためにユニークIDを使用してseperate wcfサービスステータスメソッドを呼び出します。
  4. ステータスメソッドは、バックグラウンドプロセス(ルックアップ辞書内で実行中のプロセスを持つシングルトンマネージャを使用した)をチェックし、そのステータスを返します。
  5. 完了するまでコンシューマコール#3が報告されます。
  6. シングルトンマネージャは、完了後にプロセスをクリーンアップしたり、消費者に完了を報告したり、クリーンアップしたりすることができます。
関連する問題