WCF:流传输模式和方法返回类型,而不是流和消息

WCF:流传输模式和方法返回类型,而不是流和消息,wcf,streaming,Wcf,Streaming,我有返回大对象的服务,默认的传输模式(缓冲)不适合我们的要求 实际上,服务已经编写好了,项目团队间歇性地遇到内存不足异常和性能低下。现在,这需要通过一些补丁来修复,因为项目团队即将交付,所以重写所有服务不是一个选项 我了解到,将transfermode更改为StreamedResponse/Streamed可能在很大程度上有助于选择net.tcp而不是http绑定(具有厚客户端的intranet应用程序)。我需要知道我是会从所有的运营合同中获益,还是只从那些返回流/消息的运营合同中获益 我创建了

我有返回大对象的服务,默认的传输模式(缓冲)不适合我们的要求

实际上,服务已经编写好了,项目团队间歇性地遇到内存不足异常和性能低下。现在,这需要通过一些补丁来修复,因为项目团队即将交付,所以重写所有服务不是一个选项

我了解到,将transfermode更改为StreamedResponse/Streamed可能在很大程度上有助于选择net.tcp而不是http绑定(具有厚客户端的intranet应用程序)。我需要知道我是会从所有的运营合同中获益,还是只从那些返回流/消息的运营合同中获益

我创建了一个小示例来检查它是否对其他返回类型(DataTable/DataSet)有任何影响,并且它似乎对包括DataTable/DataSet在内的所有返回类型都有影响。我检查了一下,看起来其他人也经历过同样的行为

这里唯一缺少的是一些具体的文档,这些文档清楚地表明,无论退货类型如何,它都会影响所有的运营合同。我需要一些参考资料,以便我能就这个问题提出我的建议

请不要建议不要从服务返回DataTable/DataSet我知道这是一种不好的做法,应该一直避免,但在这种情况下,服务已经存在,我现在不能要求他们改变一切

更新: 我的看法是基于以下测试

我的界面

[ServiceContract]
public interface IMediaManager
{
    [OperationContract]
    Stream Play(int mediaId);

    [OperationContract]
    DataSet GetJunk();
}
我的实现

public class MediaManager : IMediaManager
{
    public Stream Play(int mediaId)
    {
        String path = GetMedia(mediaId);
        FileStream fStream = new FileStream(path, FileMode.Open, FileAccess.Read,FileShare.Read);
        return fStream;
    }

    public DataSet GetJunk()
    {
        return GetLargeJunkDataSet20PlusMegs();
    }
}
通过IIS托管-非Http WAS,服务器配置文件(标签剥离,仅相关标签)


客户端配置文件(仅相关标记)


如果您在上面看到,maxBufferSize是1001字节,但是实际消息是20+mb。这使我认为流式处理也适用于数据集(所有内容,不仅限于流和消息)。我希望我对maxBufferSize的解释是正确的(它是在一个块中接收的最大大小)。 我还必须补充一点,如果切换到缓冲模式,同样的方法会失败

我希望我的分析有意义,如果不清楚,请让我知道,我会再试一次吗

我会再次重复我的问题,这样它就不会丢失:)

这里唯一缺少的是一些具体的文档,这些文档清楚地表明,无论退货类型如何,它都会影响所有的运营合同。我需要一些参考资料/经验,以便我能就这个问题提出我的建议

任何帮助都将不胜感激

谢谢


A终于找到了相关的东西

该数据集是IXMLSerializable的继承子数据集,因此它是流式处理的候选数据集。以下内容摘自MSDN()

跨流传输发生的操作最多可以有一个输入或输出参数。该参数对应于消息的整个主体,必须是消息、派生类型的流或IXmlSerializable实现。具有操作的返回值相当于具有输出参数

数据集是IXmlSerializable的一个实现。数据集的

谢谢


A

看一看。第一部分涉及运营合同及其要求。@Tim,我以前读过这篇文章,那篇文章增加了我的困惑:(…那篇文章有以下文字,这让我觉得除了流以外,没有任何内容是以流传输的。请阅读下面粘贴的文字“GetStream操作以字符串形式接收一些缓冲的输入数据,并对其进行缓冲,然后返回一个流。相反,UploadStream接收一个流(流)并返回一个bool(缓冲)。”您在帖子中指出,流似乎会影响服务中的所有操作。是什么导致您得出这个结论的?(并不是说这是错误的,只是好奇为什么你会这么认为。)@Tim补充了一个问题,因为需要更多的空间和格式。
<system.serviceModel>
<services>
  <service name="MediaService.MediaManager" behaviorConfiguration="MediaServiceBehavior">
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:9876/MediaService/MediaManager.svc" />
      </baseAddresses>
    </host>
    <endpoint address="" binding="customBinding"
              bindingConfiguration="StreamedTcpBinding" name="MediaManagerTcp"
              contract="MediaService.IMediaManager" />
    <endpoint address="mexTcp" binding="mexTcpBinding" name="mexTcp"
              contract="IMetadataExchange" />
  </service>
</services>
<bindings>
  <customBinding>
    <binding name="StreamedTcpBinding" sendTimeout="00:10:00" receiveTimeout="00:10:00">
      <binaryMessageEncoding />
      <tcpTransport transferMode="Streamed" portSharingEnabled="true"  />
    </binding>
  </customBinding>
</bindings>
<binding name="MediaManagerTcp" closeTimeout="00:01:00" openTimeout="00:01:00"
      receiveTimeout="00:10:00" sendTimeout="00:01:00" transactionFlow="false"
      transferMode="Streamed" transactionProtocol="OleTransactions"
      hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxBufferPoolSize="2147483647"
      ***maxBufferSize="1001"*** maxConnections="10" maxReceivedMessageSize="2147483647">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <reliableSession ordered="true" inactivityTimeout="00:10:00"
        enabled="false" />
      <security mode="None">
        <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
        <message clientCredentialType="Windows" />
      </security>
    </binding>
[SerializableAttribute]
public class DataSet : MarshalByValueComponent, IListSource, 
IXmlSerializable, ISupportInitializeNotification, ISupportInitialize,ISerializable