首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WCF和MTOM流

WCF和MTOM流
EN

Stack Overflow用户
提问于 2012-11-23 08:32:36
回答 1查看 14.1K关注 0票数 6

我使用WCF绑定流传输模式,用于将二进制内容上载或下载到服务中。我已经设法让它起作用了。我将包括配置,合同等,以供参考。

我做了一些测试来测试不同的绑定和编码。上传结果似乎没问题。NetTcp是最快的,其次是BasicHttp,然后是BasicHttp。让我感到惊讶的是,当下载大文件时,MTOM比使用BasicHttp的文本编码和使用NetTcp的二进制编码要慢得多。

我是不是遗漏了什么?为什么BasicHttp在上传时比其他绑定要慢得多?除此之外,我还为下载实现了双缓冲。这也适用于所有绑定,但使用MTOM编码的BasicHttp除外。为什么双缓冲在使用MTOM时没有帮助?

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

测试结果:

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

从服务下载100 MB二进制数据。服务创建内存流并传递给客户端。客户端写入文件系统。以下是单缓冲区和双缓冲区的结果。正如您所看到的,MTOM看起来非常慢,并且对双缓冲也没有响应。

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

代码语言:javascript
复制
<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>

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

代码语言:javascript
复制
<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>

服务合同:

代码语言:javascript
复制
[ServiceContract]
public interface IFileService
{
    [OperationContract]
    void UploadFile(DocumentData document);

    [OperationContract]
    DocumentData DownloadFile();
}

电文合同:

代码语言:javascript
复制
[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; }
}

编辑:这是我在工作中的开发环境设置的一个问题。当我在家里做同样的测试时,结果和预期的一样。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-24 09:21:36

我将添加用于实现流的链接,并接受这作为一个答案。

Dimitris Papadimitriou使用WCF上载/下载文件时的进度指示

在流的读/写过程中实现双缓冲。(见Thomas Levesque的回答)

双重缓冲的另一个实现,它做同样的事情。(见Nicholas Carey的回答)

使用SqlFileStream从WCF服务返回流

工作样条

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13525402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档