これは私が先週調査したところでは解決策が見つからない問題です。同じことを尋ねる投稿を見つけましたが、決して答えを得ることはできません。WCFサービスからのストリームを読み込まずにストリームを中止する方法はありますか?
私はWCF
サービスを持っていて、その中にstream
を含むオブジェクトを返します。私はbasicHttpBinding
をストリーム転送とMtomを使ってクライアントに送ります。
クライアントはWCF
サービスを呼び出し、応答オブジェクトを受信した直後にプロキシを閉じます。
次に、クライアントはWCFサービスから取得したストリームを読み取り、ローカルディスク上のファイルに書き込みます。これらはすべて正常に動作します。
私の問題は、クライアントが操作を中止し、WCFサービスからのデータのダウンロードを停止したいときです。 .close()
をストリームに呼び出すと、serverReply.DataStream.Close();
などのストリームがブロックされ、WCFサービスからストリーム全体が読み込まれて終了するまで続きます。ストリームはかなり大きく、ネットワークは常に高速であるとは限りません。
これは、ネットワークリソースの使用には非常に好ましくありません。これは、基本的には使用されていないデータで無駄になります。 basicHttpBinding
は、WCFサービスサーバーに対して2つの同時TCP接続(デフォルト)を許可するだけなので、ストリームが最後まで読み込まれるまで、他の接続の試行をブロックします。
私は同時接続数を増やすことができますが、これはトラブルの原因となるため、問題の解決策になります。
たとえば、20件のダウンロードが中断されたデータをダウンロードしているとします。私は転送を完全に停止させる必要があります。
クライアントでは、ストリームオブジェクトは普通のStream
クラスなので、closeメソッドのみがあり、それ以外は何もありません。
.close()
または.abort()
をプロキシオブジェクトにコールすると、.dispose()
または他の方法を使用しても破棄されません。 サーバー側ではOperationContext.OperationCompleted
イベントを処理しますが、stream
のデータが最後まで読み込まれるまでは起動されません。
それで、ストリームを完全に読み込まずにストリームを閉じたり、中止したりするにはどうすればいいですか?
これで運がいいですか? – Schultz9999
本当に大きなファイルを送信しているときに同じ問題が発生しました...本当に明白な何かが欠落している必要があります。回避策としてチャンクを実装する必要があります。 –