假设我正在处理涉及发送大量数据的服务。
如果我用 WCF 实现这个,WCF 会根据每个请求需要多少内存来限制服务吗?或者每次我收到大量服务命中时,我是否会持续出现内存不足异常?
我很好奇在 WCF 之外处理这个问题,我对服务开发还是有点陌生......
假设我正在处理涉及发送大量数据的服务。
如果我用 WCF 实现这个,WCF 会根据每个请求需要多少内存来限制服务吗?或者每次我收到大量服务命中时,我是否会持续出现内存不足异常?
我很好奇在 WCF 之外处理这个问题,我对服务开发还是有点陌生......
虽然像 Andrew Hare 所建议的那样使用绑定属性和 readerQuotas 将允许对于大多数实际用途基本上无限大小,请记住,如果您接受长时间运行的命令,您将遇到其他问题,例如超时,无论该服务如何构造(使用或不使用 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>
WCF 确实有一个默认的有效负载大小限制,它将拒绝超过一定字节数的消息。这当然可以在配置文件的绑定部分进行配置。这是一个粗略的示例,basicHttpBinding
向您展示了许多可用的属性:
<bindings>
<basicHttpBinding>
<binding name="testBinding" maxReceivedMessageSize="2147483647">
<readerQuotas
maxDepth="2147483647"
maxStringContentLength="2147483647"
maxArrayLength="2147483647"
maxBytesPerRead="2147483647"
maxNameTableCharCount="2147483647" />
</binding>
</basicHttpBinding>
这个想法是您可以创建许多不同的绑定,您可以将它们用于不同的场景。这很好,因为您可以微调服务的使用方式,并且只增加需要它们的端点的消息大小限制。
如果您使用的是 NetTCPBinding 或 NetNamedPipeBinding,您可以使用 MaxConnections 属性:
<bindings>
<netTcpBinding>
<binding name="myTCPBinding" maxConnections="15"/>
</netTcpBinding>
</bindings>