Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 从WCF Serivce返回大量收藏_.net_Wcf_Service - Fatal编程技术网

.net 从WCF Serivce返回大量收藏

.net 从WCF Serivce返回大量收藏,.net,wcf,service,.net,Wcf,Service,我正在尝试确定构建WCF服务的最佳方法,而我最头疼的领域是返回对象列表 内置的maxMessageSize 64k看起来相当高,我真的不想把它放大(快速谷歌搜索发现100多个地方将maxMessageSize放大到数千GB的范围,这看起来很愚蠢)。但是,当我返回一个对象集合(~150项)时,我超过了默认的64k 我几乎要返回我自己的类了,该类继承IEnumerable,并具有hasNext、hasPrevious和PageSize的属性,这样我就可以在客户端实现分页了——这似乎有很多代码。另一个

我正在尝试确定构建WCF服务的最佳方法,而我最头疼的领域是返回对象列表

内置的maxMessageSize 64k看起来相当高,我真的不想把它放大(快速谷歌搜索发现100多个地方将maxMessageSize放大到数千GB的范围,这看起来很愚蠢)。但是,当我返回一个对象集合(~150项)时,我超过了默认的64k

我几乎要返回我自己的类了,该类继承IEnumerable,并具有hasNext、hasPrevious和PageSize的属性,这样我就可以在客户端实现分页了——这似乎有很多代码。另一个选择是提升maxMessageSize并希望达到最好,但这感觉是错误的

我的服务的所有其他方面都很好,只是返回了我遇到问题的大型集合


对于后台,此服务有两种类型的使用者,UI应用程序(主要是web和/或wpf应用程序)和数据处理应用程序、.NET控制台应用程序,以及其他一些非UI应用程序。对于UI应用程序,我希望保持它们的响应性,并保持messageSize较低。在控制台应用程序上,这并不重要,因为它们只是向下拉数据以进行处理并将其推回到服务中。

我相信maxMessageSize的默认值如此低的原因是为了降低DoS攻击的风险

如果响应消息很大,则需要增加maxMessageSize的是客户端配置。对于客户端来说,DoS不太可能是一种风险,因此将其增加到非常大的值是安全的

但这并不是“提升maxMessageSize并期待最好的结果”——您应该决定应用程序的预期最大大小,同时考虑是否决定使用分页,并对其进行适当配置

在服务器上,maxMessageSize需要足够大,以容纳允许的最大请求消息。在这里,DoS可能是一个问题,尽管在某些环境中(例如Intranet),使用非常大的值可能是安全的

如果您的服务公开了一个允许客户端查询潜在大型数据集的操作,那么分页的另一种方法是定义客户端在一次调用中可以请求的最大项数

例如,您可能有一个操作,允许客户端请求货币列表和日期范围的汇率:

public IList<ExchangeRate> GetExchangeRates(string baseCurrency, IList<string> currencies, DateTime startDate, DateTime endDate);
然后,客户机需要查询
GetMaximumResultCount
,并确保:

(endDate - startDate).TotalDays * currencies.Count < maximumResultCount
(endDate-startDate).TotalDays*currencies.Count

如果客户端未能遵守这一点,服务器将抛出适当的
故障异常

您可以使用MTOM消息加密。当发送大数据时,它是流的替代方案。以下是一个配置示例:

 <system.serviceModel>
     …
    <bindings>
      <wsHttpBinding>
        <binding name="ExampleBinding" messageEncoding="Mtom"/>
      </wsHttpBinding>
    </bindings>
     …
<system.serviceModel>

…
…
只需将绑定配置中的messageEncoding属性设置为Mtom即可。另外,更改maxReceivedMessageSizemaxBufferSize


A和更多信息

为什么增加maxMessageSize是愚蠢的?它实际上要么增大大小,要么成片发送。我不会一个接一个地要求。如果调用是异步的,Ui仍然可以对大型集合做出响应。我想愚蠢是一个糟糕的词选择,但我的意思是默认值存在是有原因的,当我需要更改默认值时,我总是尝试后退一步,特别是当我不完全理解为什么默认值是这样的时候。Bross:默认消息大小为64K,以避免拒绝服务攻击。假设是2 GB—攻击者可以用2 GB的消息淹没您的服务,从而淹没您可能拥有的任何硬件。拒绝任何大于64K的消息将不可能(或至少不太可能)获得合理的大小,因为64K似乎足以满足我处理的相对适中的数据大小,但我不断遇到该限制的问题。您也可以为异步调用设置操作,获取数据时释放客户端操作。
 <system.serviceModel>
     …
    <bindings>
      <wsHttpBinding>
        <binding name="ExampleBinding" messageEncoding="Mtom"/>
      </wsHttpBinding>
    </bindings>
     …
<system.serviceModel>