我正在尝试编写一个 WCF Web 服务,它本质上归结为一个不受我控制的外部 Web 服务的代理(特别是一个主要的视频共享站点)。我需要能够将大约 10-100 MB 的数据从客户端发送到我的 Web 服务,然后将该数据发送到外部服务。
我可以这样做,但是为了能够扩展,我希望它尽可能多地流式传输,而不是将整个请求正文读入内存,然后将其全部发布到一个块中到外部服务。
我在我的配置中有bindingConfiguration
设置transferMode="Streamed"
:
<bindings>
<webHttpBinding>
<binding name="WebHttpBindingConfig" maxReceivedMessageSize="104857600"
transferMode="Streamed"
maxBufferSize="104857600"
maxBufferPoolSize="104857600">
</binding>
</webHttpBinding>
</bindings>
该服务将 aStream
作为其唯一参数:
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)时,监视发送到外部服务的内容(在此示例中,在我的家用计算机上运行一个假监听器),没有发送任何数据直到收到所有数据。
我尝试将SendChunked
传出请求上的属性设置为 true,但这并没有改变任何东西。