我正在使用流式传输模式的WCF绑定,用于向服务上载和从服务下载二进制内容。我设法让它运作起来。我将包括配置,合同等以供参考。
我做了一些测试来测试不同的绑定和编码。上传结果似乎没问题。 NetTcp是最快的,其次是BasicHttp-MTOM,然后是BasicHttp-Text。让我感到惊讶的是,在下载大文件时,与使用BasicHttp的文本编码和使用NetTcp的二进制编码相比,MTOM非常慢。
我错过了什么吗?为什么在上传时BasicHttp-MTOM的工作速度比其他绑定慢?除此之外,我还为下载实现了双缓冲。除了带有MTOM编码的BasicHttp之外,这也适用于所有绑定。为什么使用MTOM时双缓冲无效?
感谢您的阅读,您对此的建议和想法。
测试结果:
将150 MB二进制数据上传到服务。客户端从150 MB文件创建文件流并传递给服务器。服务器将流读入内存流。还没有双重缓冲。由于没有向文件系统写入数据,因此结果似乎很快。并且绑定按预期执行。
从服务下载100 MB二进制数据。服务创建内存流并传递给客户端。客户端写入文件系统。以下是单缓冲区和双缓冲区的结果。如你看到的 MTOM似乎非常慢,也不会对双缓冲做出响应。
服务器配置(为简单起见省略了一些部分):
<configuration>
<system.web>
<httpRuntime maxRequestLength="2147483647"/>
</system.web>
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="StreamedNetTcpBinding"
transferMode="Streamed"
maxReceivedMessageSize="1099511627776">
</binding>
</netTcpBinding>
<basicHttpBinding>
<binding name="StreamedBasicHttpBindingWithMtom"
messageEncoding="Mtom" transferMode="Streamed"
maxReceivedMessageSize="1099511627776">
</binding>
<binding name="StreamedBasicHttpBinding"
transferMode="Streamed"
maxReceivedMessageSize="1099511627776">
</binding>
</basicHttpBinding>
</bindings>
</system.serviceModel>
</configuration>
客户端配置(为简单起见省略了一些部分):
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="StreamedBasicHttpBindingWithMtom"
maxReceivedMessageSize="1099511627776"
messageEncoding="Mtom" transferMode="Streamed">
</binding>
<binding name="StreamedBasicHttpBinding"
maxReceivedMessageSize="1099511627776"
transferMode="Streamed">
</binding>
</basicHttpBinding>
<netTcpBinding>
<binding name="StreamedNetTcpBinding" transferMode="Streamed"
maxReceivedMessageSize="1099511627776">
</binding>
</netTcpBinding>
</bindings>
</system.serviceModel>
</configuration>
服务合同:
[ServiceContract]
public interface IFileService
{
[OperationContract]
void UploadFile(DocumentData document);
[OperationContract]
DocumentData DownloadFile();
}
消息合同:
[MessageContract]
public class DocumentData
{
[MessageHeader(MustUnderstand = true)]
public string DocumentName { get; set; }
[MessageHeader(MustUnderstand = true)]
public int FileLength { get; set; }
[MessageBodyMember(Order = 1)]
public Stream Data { get; set; }
}
<小时/> 编辑:这是我的开发环境设置工作中的一个问题。当我在家里进行相同的测试时,结果与预期一致。
答案 0 :(得分:3)
我将添加用于实现流式传输的链接,并接受此作为答案。
Progress Indication while Uploading/Downloading Files using WCF By Dimitris Papadimitriou
Implementation of double buffering while reading/writing from/to a stream. (See Thomas Levesque's answer)
Another implementation for double buffering, which does the same thing. (See Nicholas Carey's answer)
Return Stream from WCF service, using SqlFileStream