簡體   English   中英

將數據從REST WCF服務流式傳輸到外部Web服務

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM