我使用WCF绑定流传输模式,用于将二进制内容上载或下载到服务中。我已经设法让它起作用了。我将包括配置,合同等,以供参考。
我做了一些测试来测试不同的绑定和编码。上传结果似乎没问题。NetTcp是最快的,其次是BasicHttp,然后是BasicHttp。让我感到惊讶的是,当下载大文件时,MTOM比使用BasicHttp的文本编码和使用NetTcp的二进制编码要慢得多。
我是不是遗漏了什么?为什么BasicHttp在上传时比其他绑定要慢得多?除此之外,我还为下载实现了双缓冲。这也适用于所有绑定,但使用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; }
}
编辑:这是我在工作中的开发环境设置的一个问题。当我在家里做同样的测试时,结果和预期的一样。

发布于 2012-11-24 09:21:36
我将添加用于实现流的链接,并接受这作为一个答案。
Dimitris Papadimitriou使用WCF上载/下载文件时的进度指示
在流的读/写过程中实现双缓冲。(见Thomas Levesque的回答)
https://stackoverflow.com/questions/13525402
复制相似问题