2009-01-26 143 views
16

讓我們假設我正在處理涉及發送大量數據的服務。WCF服務限制

如果我用WCF實現這個,WCF會根據每個請求需要服務多少內存來限制服務?或者,每當我收到大量匹配到我的服務時,我是否會持續發生內存不足異常?

我來處理WCF之外的這個問題很好奇,我還是有點新業務的發展...

+0

任何.NET應用程序可以生成一個內存不足的異常。我希望有一天能夠看到智能執行主機,但似乎需要應用程序和主機之間的另一層通信。如果它值得,它可能已經存在於Windows服務中。 – 2009-01-26 16:54:00

回答

12

雖然使用綁定屬性和readerHotas,如Andrew Hare所建議的,在大多數實際應用中,基本上可以允許無限大小,但請記住,如果您接受長時間運行的命令,則會遇到其他問題,例如超時關於如何構建服務(使用WCF或不)。

無論消息的大小如何,都需要對WCF服務進行性能調節,以避免泛洪。如果您將其託管在IIS或WAS中,那麼您將爲這些託管環境提供額外的內置功能,從而使您的服務更「高可用」。但是,您仍然需要關注併發問題。以下WCF配置提供了設置一些限制值的示例。

<system.serviceModel> 

    ... 

    <behaviors> 
     <serviceBehaviors> 
     <behavior name="GenericServiceBehavior"> 
      <serviceTimeouts transactionTimeout="00:09:10"/> 
      <serviceThrottling 
      maxConcurrentCalls="20" 
      maxConcurrentSessions="20" 
      maxConcurrentInstances="20" 
      /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
+1

完全是我以後的樣子,我想我們會在儘可能降低每次通話的內存使用量之後再進行調整階段:) 優秀的答案 – Spence 2009-01-27 10:15:57

3

WCF確實有一個默認的有效載荷大小限制,將拒絕在消息一定數量的字節。這當然可以在配置文件的綁定部分進行配置。這是一個帶basicHttpBinding粗例子顯示你很多提供給你的屬性:

<bindings> 
    <basicHttpBinding> 
     <binding name="testBinding" maxReceivedMessageSize="2147483647"> 
      <readerQuotas 
       maxDepth="2147483647" 
       maxStringContentLength="2147483647" 
       maxArrayLength="2147483647" 
       maxBytesPerRead="2147483647" 
       maxNameTableCharCount="2147483647" /> 
     </binding> 
    </basicHttpBinding> 

的想法是,你可以創建你可以使用不同的場景很多不同的綁定。這很好,因爲您可以微調服務的消耗方式,只增加需要它們的端點的消息大小限制。

+0

我明白你在做什麼,但如果我能夠控制消息的大小,我會的。得到愛的圖像。 – Spence 2009-01-27 10:14:16

3

如果您使用NetTcpBinding的或NetNamedPipeBinding可以使用MaxConnections最大屬性:

<bindings> 
    <netTcpBinding> 
    <binding name="myTCPBinding" maxConnections="15"/> 
    </netTcpBinding> 
</bindings> 
+0

這適用於我,所以+1,但是EnocnRoll's答案很清楚,也許下一次:(。 – Spence 2009-01-27 10:15:13