使用WCF的客户端配置

时间:2009-12-14 16:52:10

标签: wcf

从我的Silverlight 3应用程序中,我使用了WCF服务。我将整数列表传递给服务。此列表可以获得非常大的> 10k条目。最终,当列表变大时,我从服务中收到错误。

我知道,我可以设置该值以允许在ServiceReference.ClientConfig文件中传输更多数据,但我不知道要设置的位置和属性。

当配置在服务器中完成时,我现在显示服务器配置:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

<appSettings>
     ...
</appSettings>

<system.web>
<compilation debug="true" />
    <httpRuntime maxRequestLength="1048576"
                             executionTimeout="200" />
</system.web>
<system.serviceModel>
<extensions>
  <behaviorExtensions>
    <add name="silverlightFaults" type="DiscoDataSource.SilverlightFaultBehavior, DiscoDataSource, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  </behaviorExtensions>
</extensions>
<bindings>
  <basicHttpBinding>
            <binding name="MyBinding" closeTimeout="10:00:00" openTimeout="10:00:00"
      receiveTimeout="10:00:00" sendTimeout="10:00:00" maxBufferSize="6553600"
      maxBufferPoolSize="6553600" maxReceivedMessageSize="6553600" >
                <readerQuotas maxArrayLength="2147483647"/>
            </binding>
  </basicHttpBinding>
</bindings>
<services>
  <service behaviorConfiguration="DiscoDataSource.Service1Behavior"
    name="DiscoDataSource.Service1">
    <endpoint address="" behaviorConfiguration="DiscoBehavior" binding="basicHttpBinding"
      bindingConfiguration="MyBinding" name="standardEndPoint" contract="DiscoDataSource.IService1">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8731/Design_Time_Addresses/DiscoDataSource/Service1/" />
      </baseAddresses>
    </host>
  </service>
</services>
<behaviors>
  <endpointBehaviors>
    <behavior name="DiscoBehavior">
      <dataContractSerializer maxItemsInObjectGraph="2147483646" />
                <silverlightFaults />
    </behavior>
  </endpointBehaviors>
  <serviceBehaviors>
    <behavior name="DiscoDataSource.Service1Behavior">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="True" />
    </behavior>
  </serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
编辑:我已经尝试了我发送的列表的大小(它是一个包含对象的字典总是为null)。在60k元素(~0.5 MB)之后,发生错误。真正困扰我的是,错误是臭名昭着的NotFound-Error - 尽管我改变了错误报告行为(适用于服务代码抛出的异常)

我已经添加了bnkdev和marc_s的答案,但不幸的是,似乎还有另一个障碍。

任何人都可以帮助我吗?

提前致谢, 弗兰克

2 个答案:

答案 0 :(得分:1)

由于您正在使用http,因此查看httpRuntime的maxRequestLength可能是值得的,例如。

<httpRuntime maxRequestLength="2097151"/>

答案 1 :(得分:0)

maxArrayLength中还有一个额外的参数<ReaderQuotas>,它决定了数组中元素的最大数量 - 默认为8192.

<bindings>
    <basicHttpBinding>
        <binding name="standardBindingPoint" closeTimeout="10:00:00"
            openTimeout="10:00:00" receiveTimeout="10:00:00" sendTimeout="10:00:00"
            maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
            <readerQuotas maxArrayLength="15000"/>
            <security mode="None" />
        </binding>
    </basicHttpBinding>
</bindings>

将其增加到超过其默认值,大到足以容纳最大的整数列表。