1

基本的に、自分の管理下にない外部 Web サービス (具体的には、主要なビデオ共有サイト) のプロキシに要約される WCF Web サービスを作成しようとしています。クライアントから Web サービスに最大 10 ~ 100 MB のデータを送信し、そのデータを外部サービスに送信できる必要があります。

私はそれを行うことができますが、スケーリングできるようにするために、リクエスト本文全体をメモリに読み取ってから、すべてを 1 つのチャンクで外部サービスに POST するのではなく、できるだけストリーミングしたいと考えています。

私は自分のbindingConfiguration設定に設定しtransferMode="Streamed"ています:

<bindings>
  <webHttpBinding>
    <binding name="WebHttpBindingConfig" maxReceivedMessageSize="104857600"
             transferMode="Streamed"
             maxBufferSize="104857600"
             maxBufferPoolSize="104857600">
    </binding>
  </webHttpBinding>
</bindings>

サービスはStream唯一の引数として a を取ります:

public abstract class Upload<NetworkID> : IUpload
{
    protected abstract string DatabaseConnection { get; }

    public Stream UploadVideo(Stream stream)
    {
        LogManager.GetLogger("Logger").Trace("Upload starting:");
        try
        {
            HttpWebRequest request;
            request = (HttpWebRequest)WebRequest.Create("http://faketestservice:8800/upload");
            request.Method = "POST";
            request.ContentType = "application/octet-stream";

            request.ContentLength = WebOperationContext.Current.IncomingRequest.ContentLength;
            stream.CopyTo(request.GetRequestStream(), 64 * 1024 * 1024);
        }
        catch (Exception ex)
        {
            LogManager.GetLogger("Logger").Trace("caught: " + ex.ToString());
        }

        return new MemoryStream(Encoding.UTF8.GetBytes("hello upload"));
    }
}

このサービスは、単純に着信要求ストリームを取得し、一度に 64K ずつ発信要求ストリームにコピーします。

しかし、外部サービス (この例では、自宅のコンピューターで実行されている偽のリスナー) に送信されるデータを監視しながら、Fiddler を介してサービスにデータ (私の例では ~16MB) を送信しようとすると、データは送信されません。すべてのデータが受信されるまで。

送信リクエストのプロパティを true に設定しようとしましたSendChunkedが、何も変わりません。

4

2 に答える 2

0

CopyTo 関数で大きすぎるバッファ サイズを設定しています。小さい値に設定するか、バッファ サイズをまったく渡さずにデフォルト (4096) のままにします。基本的に、一度に 64MB を転送するように指示しています。つまり、64MB を読み取って送信し、さらに 64MB を読み取って送信します。

さらに、これには「Chunked」を使用する必要はありません。これは、必要のない HTTP の特別な機能です。

さらに、Fiddler が終了後にのみ応答を表示しないことを確認してください。それはあなたに嘘をついているかもしれません。

于 2012-08-21T21:33:30.813 に答える
0

あなたの例では、着信ストリームを読み取り、最大 64MB を送信する単一の POST がまだあります。

ビデオ共有サイトがデータを部分的に取得できる場合、あなたが(おそらく)やりたいことは、受信データをサービスにループさせ、(個々の POST を介して)小さなチャンクで最終サービスに送信することですか? どのサービスですか?

于 2012-08-21T21:38:13.933 に答える