簡體   English   中英

WCF客戶端使用流傳輸模式進行緩沖

[英]WCF Client is Buffering with Streamed Transfer Mode

我的最終目標是將大型視頻文件和流上傳到WCF服務,該服務配置為流式傳輸模式。 我遇到的問題是我的WCF客戶端只在流被讀取到結束后才向服務發出請求。

主要用例是將實時流中繼到沒有預定義終點的服務,因此在發送任何數據之前完全讀取這些流是不切實際的。 為了測試這個功能,我創建了一個“無限”流:

public class InfiniteStream : Stream
{
    private Random _random;

    public InfiniteStream()
    {
        _random = new Random(1);
    }

    public override int Read(byte[] buffer, int offset, int count)
    {
        _random.NextBytes(buffer);
        Position += count;
        return count;
    }

    // other unimportant methods
}

與我發現的示例一致,MessageContract用於接收流式上傳:

[MessageContract]
public class ClipUpload : IDisposable
{
    [MessageHeader(MustUnderstand = true)]
    public long MediaId;

    [MessageBodyMember(Order=1)]
    public System.IO.Stream MediaStream;

    // disposable implementaton
}

現在,據我所知,我的服務已正確配置為流式傳輸,並且可以在服務器端讀取流而不會出現問題。 感興趣的服務器配置:

<basicHttpsBinding>
    <binding name="A" transferMode="Streamed" maxReceivedMessageSize="4294967296" maxBufferSize="65536">
        <security mode="TransportWithMessageCredential">
            <message clientCredentialType="UserName" />
        </security>
    </binding>
</basicHttpsBinding>

感興趣的客戶端配置:

<basicHttpsBinding>
    <binding name="A" transferMode="Streamed" maxBufferSize="65536">
        <security mode="TransportWithMessageCredential" />
    </binding>
</basicHttpsBinding>

服務器端操作很簡單。 在我的服務界面::

[OperationContract(IsOneWay=true)]
void UploadClip(ClipUpload upload);

執行:

public void UploadClip(ClipUpload upload)
{
    using (var stream = new FileStream(@"C:\Temp\temp.mp4", FileMode.Create, FileAccess.Write))
    {
        upload.MediaStream.CopyTo(stream);
    }

客戶端也使用簡單的調用:

using(var stream = new InfiniteStream())
{
    _service.UploadClip(1, stream);
}

同樣,問題是客戶端在完全讀取流之前不發送任何流數據,這當然不會是InfiniteStream的情況。 因此,流程永遠不會到達服務器的UploadClip方法。 對於非“無限”流,該過程有效,但是當客戶端看似緩沖所有流內容時存在相當大的延遲。

似乎Fiddler可能已經引入了自己的緩沖區。 隨着Fiddler關閉,流式傳輸請求被正確地傳遞給WCF。

在相關的說明中,似乎在.NET 4.0及更低版本上,IIS中托管的流式WCF服務的服務器端緩沖是不可避免的。 ASP.NET層有自己的緩沖機制,在將消息傳遞給WCF之前等待消息完全接收。 更多細節在這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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