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