基本的に、自分の管理下にない外部 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
が、何も変わりません。