wcf - 使用 WCF 和 MTOM 进行流式传输

标签 wcf wcf-binding mtom wcf-streaming

我正在使用具有流传输模式的 WCF 绑定(bind),用于向/从服务上传和下载二进制内容。我已经设法让它工作了。我将包括配置、契约(Contract)等以供引用。

我进行了一些测试来对不同的绑定(bind)和编码进行基准测试。上传结果似乎没问题。 NetTcp 最快,其次是 BasicHttp-MTOM,然后是 BasicHttp-Text。让我吃惊的是,在下载大文件时,MTOM 的速度比使用 BasicHttp 的文本编码和使用 NetTcp 的二进制编码慢。

我错过了什么吗?为什么上传时 BasicHttp-MTOM 的工作速度比其他绑定(bind)慢?除此之外,我还为下载实现了双缓冲。这也适用于除具有 MTOM 编码的 BasicHttp 之外的所有绑定(bind)。为什么在使用 MTOM 时双缓冲没有帮助?

感谢您的阅读,您对此的建议和想法。

测试结果:

将 150 MB 二进制数据上传到服务。客户端从 150 MB 文件创建文件流并传递给服务器。服务器将流读入内存流。还没有双缓冲。结果似乎很快,因为没有将数据写入文件系统。绑定(bind)按预期执行。

Upload

从服务下载 100 MB 二进制数据。服务创建一个内存流并传递给客户端。客户端写入文件系统。这是单缓冲区和双缓冲区的结果。如你看到的
MTOM 似乎非常慢,并且也不响应双缓冲。

Download

服务器配置(为简单起见省略了一些部分):

<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; }
}

编辑:这原来是我工作中的开发环境设置的一个问题。当我在家中进行相同的测试时,结果符合预期。

Download

最佳答案

关于wcf - 使用 WCF 和 MTOM 进行流式传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13525402/

相关文章:

wcf - 部署使用 netTcpBinding 的 WCF 服务(非 IIS 托管)

c# - VS2010 中跨多个 Web 服务的通用 DTO

带有 CustomBinding 的 WCF 服务配置 HTTPS

c# - 无法通过 WCFTestClient 测试自托管 WCF 服务

突发请求时客户端上的 wcf 死锁

c# - 内存流和大对象堆

c# - 使用 HTTP GET 配置 WCF 客户端以使用 WCF 服务

.net - WSE 3.0 - 字节数组被编码为 Base64 而不是 "MTOM-ing"到二进制

java - SAAJ 与 MTOM + XOP 兼容吗?

java - 判断DataHandler的InputStream是否为空