使用Streaming的BasicHttpBinding上的WCF Web服务使用超过2演出的ram

时间:2014-02-07 19:20:55

标签: c# wcf memory

我有一个IIS托管的WCF Web服务,它有两个端点,一个用于wsHttpBinding,另一个用于basicHttpBinding。我使用basicHttpBinding,所以我可以将transferMode设置为“Streamed”,这样我就可以流文件了。此服务也在SSL下,需要客户端证书才能连接。

当我调用wsHttpBinding服务时,一切都很好。当我调用basicHttpBinding服务来传输文件时,它将使用所有免费ram(机器有2.5演出),然后点击页面文件并引发硬故障。所有这些硬故障和磁盘交换都会导致服务超时,因为它需要超过60秒才能返回。

以下是我正在调用的所有内存和超时的功能

[OperationBehavior]
public Stream GetOrderResults(string clientName, string userName, string password, string institutionId, Guid orderId, string fileName)
{
var fileStream = new System.IO.FileStream(@"\\iwebdev510\Relateprod\TDHub\Temp\TDTestClient\bob.xml", FileMode.Open);
return fileStream;
}

调用webservice的客户端的配置文件如下所示:

    <?xml version="1.0"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
  <system.serviceModel>
    <!-- REMOVE THE BEHAVIORS FOR DEV TESTING -->
    <behaviors>
      <endpointBehaviors>
        <behavior name="ClientCertBehavior">
          <clientCredentials>
            <clientCertificate x509FindType="FindByThumbprint" findValue="8b08c6e6e356a345212e539979fbcaca337aae8a"/>
          </clientCredentials>
        </behavior>
      </endpointBehaviors>
    </behaviors>

    <client>
      <!--Dev Endpoints With Certs-->
      <endpoint address="https://<obfuscated>/secure/TDHubService.svc"
        behaviorConfiguration="ClientCertBehavior"
        binding="wsHttpBinding"
        bindingConfiguration="wsTDHubServiceBindingTLS"
        contract="MortgageCadence.External.TDHub.Protocols.Contracts.Services.ITDHubService" />
      <endpoint address="https://<obfuscated>/secure/TDHubFileTransferService.svc"
        behaviorConfiguration="ClientCertBehavior"
        binding="basicHttpBinding"
        bindingConfiguration="basicTDHubFileTransferServiceBindingTLS"
        contract="MortgageCadence.External.TDHub.Protocols.Contracts.Services.ITDHubFileTransferService" />

    </client>

    <bindings>
      <basicHttpBinding>
        <binding name="basicTDHubFileTransferServiceBinding" maxReceivedMessageSize="2147483647"
          transferMode="Streamed">
          <readerQuotas maxDepth="64" maxStringContentLength="2147483647"
            maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <security mode="None" />
        </binding>
        <binding name="basicTDHubFileTransferServiceBindingTLS" maxReceivedMessageSize="2147483647"
          transferMode="Streamed">
          <readerQuotas maxDepth="64" maxStringContentLength="2147483647"
            maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <security mode="Transport">
            <transport clientCredentialType="Certificate" />
          </security>
        </binding>
      </basicHttpBinding>
      <wsHttpBinding>
        <binding name="wsTDHubServiceBinding" maxReceivedMessageSize="2147483647">
          <readerQuotas maxDepth="64" maxStringContentLength="2147483647"
            maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <security mode="None" />
        </binding>
        <binding name="wsTDHubServiceBindingTLS" maxReceivedMessageSize="2147483647">
          <readerQuotas maxDepth="64" maxStringContentLength="2147483647"
            maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <security mode="Transport">
            <transport clientCredentialType="Certificate" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
  </system.serviceModel>
</configuration>

我可以提供w3wp.exe正在使用的计算机资源监视器的屏幕截图,但由于我的声誉不够高,我无法将其附加到ATM上。

我发现如果我在绑定中将传输模式从“Steamed”更改为“Buffered”,它可以完全解决内存问题,但这似乎与文档建议的内容相反。该文档听起来好像你选择“缓冲”它会在发送之前将整个文件加载到内存中,但我发送了一个700兆字节的文件,并且内存在缓冲模式下没有改变。

0 个答案:

没有答案