[英]Streaming data from REST WCF service to an external web service
我正在嘗試編寫一個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>
該服務將Stream
作為其唯一參數:
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,但這並沒有任何改變。
您在CopyTo函數中設置的緩沖區大小太大。 將其設置為較小值,或者完全不傳遞緩沖區大小,將其保留為默認值(4096)。 您基本上是在告訴它一次傳輸64MB。 這意味着它將讀取64MB,發送,再讀取64MB,發送等等。
此外,您不需要為此使用“ Chunked”。 這是您不需要的HTTP的特殊功能。
除此之外,請確保Fiddler僅在完成后才顯示響應。 它可能在騙你。
在您的示例中,您仍然只有一個POST,可以讀取傳入的流並發送高達64MB的輸出。
您(可能)想要做的是讓您的服務循環進入的數據,如果視頻共享站點可以部分接收數據,則將其(通過單獨的POST)以小塊的形式發送到最終服務? 這是什么服務?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.