2009-01-26 97 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