2

クライアントからサーバーへのファイル転送を処理する非常に単純なwcfサービスを実装しました。問題は、クライアントがファイル要求を送信するときです。すべての帯域幅はその単一のクライアントに割り当てられ、他のクライアントは要求されたファイル転送が完了するまで待機する必要があります。だから私の質問は、サービスをより効率的にし、ユーザーが帯域幅を共有できるようにする方法です

[ServiceBehavior(IncludeExceptionDetailInFaults = true, InstanceContextMode =InstanceContextMode.PerCall,
    ConcurrencyMode=ConcurrencyMode.Multiple)]

InstanceContextMode属性をPerCallに設定しましたが、それではうまくいきませんでした

更新:このプロジェクトは私のhttp://www.codeproject.com/Articles/33825/WCF-TCP-based-File-Serverに似てい ます

4

3 に答える 3

5

WCF には適切な負荷分散機能がありません。独自に開発する必要があります。ファイルを転送している場合は、ダウンロードを想定して、完全なファイルを一度に送信するのではなく、データのパケットを送信する必要があります。これを行う場合、プロセスに「delays/sleeps」を追加して、各時間枠でサーバーが送信するバイト数を制限します。これにより、他のリクエストのためのスペースが確保されます。

于 2012-04-15T14:50:51.387 に答える
4

WCF エンドポイントを介してファイルを提供することが望ましいかどうかは疑問です。これを行うことに反対する理由は、まさにあなたが抱えていた問題です。一度に少数のクライアントで機能しますが、スケールアウトするには、ロード バランサーの背後でサービスの新しいインスタンスをホストする必要があります。

ある種のストレージ サービスを使用してファイルをホストし、WCF サービスが単にファイルへのリンクまたはハンドルを返すようにすることを検討する価値があります。その後、ファイルをオフラインで取得できます。Microsoft は、まさにこの目的のためにAzure Blob Storageを作成しました。

これが元の質問に対処していないことを認識し、要件の範囲が大幅な再作業に対応できない可能性があることを理解してください。

于 2012-04-15T18:33:20.877 に答える
1

別のオプションは、大きなファイルを転送する場合にチャンキング チャネルを使用することです。例: MSDNcodeplex

私は@hughの立場に同意しますが。

于 2012-04-15T21:01:10.260 に答える