我使用带有流传输模式的 WCF 绑定,用于向服务上传二进制内容或从服务下载二进制内容。我已经成功让它发挥作用了。我将包括配置、合同等以供参考。
我做了一些测试来对不同的绑定和编码进行基准测试。上传结果似乎没问题。 NetTcp 最快,其次是 BasicHttp-MTOM,然后是 BasicHttp-Text。令我惊讶的是,当下载大文件时,MTOM 比使用 BasicHttp 的文本编码和使用 NetTcp 的二进制编码非常慢。
我错过了什么吗?为什么 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; }
}
Edit: This turned out to be an issue with my development environment setup at work. When I ran the same tests at home, the results was as expected.