使用WCF和MTOM进行流式处理

Yiğ*_*ner 6 wcf mtom wcf-binding wcf-streaming

我正在使用流式传输模式的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>
Run Code Online (Sandbox Code Playgroud)

客户端配置(为简单起见省略了一些部分):

<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>
Run Code Online (Sandbox Code Playgroud)

服务合约:

[ServiceContract]
public interface IFileService
{
    [OperationContract]
    void UploadFile(DocumentData document);

    [OperationContract]
    DocumentData DownloadFile();
}
Run Code Online (Sandbox Code Playgroud)

消息合同:

[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; }
}
Run Code Online (Sandbox Code Playgroud)


编辑:这是我的开发环境设置工作中的一个问题.当我在家里进行相同的测试时,结果如预期的那样.

下载