WCF内存急剧增加

时间:2017-09-12 06:59:28

标签: c# wcf file-upload binding stream

我正在使用WCF服务。我遇到的问题是它开始使用双内存。

我正在使用 HTTPS 绑定

<wsHttpBinding>
        <binding name="secureHttpBinding" closeTimeout="04:01:00" openTimeout="04:01:00" receiveTimeout="04:10:00" sendTimeout="04:01:00" allowCookies="false"
                 bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                  messageEncoding="Text" textEncoding="utf-8"  useDefaultWebProxy="true">
          <readerQuotas maxDepth="128" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/> 
          <security mode="Transport" >
            <transport clientCredentialType="None"/>
          </security>
        </binding>
      </wsHttpBinding>

 <endpoint address="https://localhost/test.svc"
                 binding="wsHttpBinding"
                 bindingConfiguration="secureHttpBinding"
                 contract="IWcfContract"
                 name="SecureBasicHttpBinding_WcfContract"> 

以下是我用来上传的代码

using (Stream fileStream = File.OpenRead(logsZipFullPath))
{
  // Call web server
  UploadFileResponse response = _webServiceHelper.UploadFile(fileStream, currentDate, ".zip", string.Empty);
  fileStream.Close();
}

这是我的模特

[MessageContract]
    public class UploadFileRequest : IDisposable
    {
        [MessageBodyMember(Order = 1)]
        public Stream FileByteStream;
        [MessageHeader(MustUnderstand = true)]
        public string FileDescription;

    }

我的zip文件是80MB。

我遇到的问题是在服务开始时使用 26mb ,这很好。在第一次通话时,它会在通话完成后使用 136MB ,然后降至 26mb 。这也没关系。在第二次上传调用后,使用 346MB 开始 在服务电话后再次降至 26mb 。我的问题是,当文件只有 80MB 时,为什么使用346MB?我的GC和disponse已被正确调用。但是,这是正常行为还是我遗失了什么?

1 个答案:

答案 0 :(得分:0)

终于找到了解决这个问题的方法。根据{{​​3}}

  

wsHttpBinding是完整的绑定,它支持大量的WS- *   功能和标准 - 它有更多的安全功能,你可以   使用会话连接,您可以使用可靠的消息传递   使用事务控制 - 只是更多的东西,但wsHttpBinding   也是一个很重的“,并为你的消息增加了很多开销   他们穿越网络

我认为这是内存使用率高的主要原因。我们的要求是使用HTTPS证书,我们可以将其与 basicHttpBinding 一起使用。所以我改变了我的设置

<basicHttpBinding>
        <binding name="BasicHttpBinding_WcfContract" closeTimeout="04:01:00" openTimeout="04:01:00" receiveTimeout="04:10:00" sendTimeout="04:01:00" allowCookies="false"
                 bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="2147483647" maxBufferPoolSize="2147483647"
                 maxReceivedMessageSize="2147483647" messageEncoding="Text" textEncoding="utf-8" transferMode="Streamed" useDefaultWebProxy="true">
          <readerQuotas maxDepth="128" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
          <security mode="Transport"> <-- this is the main change
            <transport clientCredentialType="None" proxyCredentialType="None" realm=""/>
            <message clientCredentialType="UserName" algorithmSuite="Default"/>
          </security>
        </binding>
      </basicHttpBinding>

注意:我将安全模式更改为传输以支持https。

现在,一切都没有问题。 两种可能导致记忆问题的事情。

  1. wsHttpBinding 费用
  2. wsHttpBinding
  3. 不支持流模式