silverlight 3 wcf服务配置 - 获取maxreceivedmessagesize错误

时间:2010-01-29 18:08:15

标签: wcf silverlight-3.0 maxreceivedmessagesize

我收到大于64K的邮件的maxreceivedmessagesize错误。问题是我已经改变了服务器和客户端中的所有内容,并没有解决问题。

这是我在服务器上的web.config,然后是silverlight客户端配置:

<system.serviceModel>
  <bindings>
    <basicHttpBinding>
      <binding name="secureobjectbind" maxBufferSize="2147483647"
          maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647">
        <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
          maxArrayLength="2147483647" maxBytesPerRead="2147483647"
          maxNameTableCharCount="2147483647" />
        <security mode="Transport" />
      </binding>
    </basicHttpBinding>
  </bindings>
  <behaviors>
    <serviceBehaviors>
      <behavior name="GiveWeb.Services.ShopBehavior">
        <serviceMetadata httpGetEnabled="false" httpsGetEnabled="true" />
        <serviceDebug includeExceptionDetailInFaults="true" />
        <dataContractSerializer maxItemsInObjectGraph="6553600" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <services>
    <service behaviorConfiguration="GiveWeb.Services.ShopBehavior"
        name="GiveWeb.Services.Shop">
      <endpoint address="" binding="basicHttpBinding" 
          bindingConfiguration="secureobjectbind" 
          contract="GiveWeb.Services.IShop">
        <identity>
          <dns value="localhost" />
        </identity>
      </endpoint>
      <endpoint address="mex" binding="mexHttpsBinding" 
        contract="IMetadataExchange" />
    </service>
  </services>
  <serviceHostingEnvironment>
    <baseAddressPrefixFilters>
      <clear/>
      <add prefix="http://www.ushop2give.com"/>
    </baseAddressPrefixFilters>
  </serviceHostingEnvironment>
</system.serviceModel>

silverlight客户端

<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IShop" maxBufferSize="2147483647"
                    maxReceivedMessageSize="2147483647">
                    <security mode="Transport" />
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="https://web14.ai-host.com/Services/Shop.svc"
                binding="basicHttpBinding" 
                bindingConfiguration="BasicHttpBinding_IShop"
                contract="ShopSVC.IShop" name="BasicHttpBinding_IShop" />
        </client>
    </system.serviceModel>
</configuration>

那为什么我仍然会收到错误?


好的,这里有更多关于帖子的信息......

我发现了一个错误。我的绑定对象的原始声明是System.ServiceModel.Channels.Binding而不是System.ServiceModel.BasicHttpBinding。这就是为什么我没有在对象上看到MaxReceivedMessageSize的属性。

我已经更正了这个并创建了一个创建我的代理的函数,但是当返回消息中有超过65536个字节时,我仍然收到错误消息。

     public static ShopSVC.ShopClient ShopClientProxy()
 {
     System.ServiceModel.EndpointAddress lxAddress = new System.ServiceModel.EndpointAddress(new Uri(Application.Current.Host.Source, "../Services/Shop.svc"));

     System.ServiceModel.BasicHttpBinding lxBinding = new System.ServiceModel.BasicHttpBinding(System.ServiceModel.BasicHttpSecurityMode.Transport);
     lxBinding.MaxReceivedMessageSize = 2147483647;
     lxBinding.MaxBufferSize = 2147483647;
     lxBinding.ReceiveTimeout = new TimeSpan(0, 5, 0);

     return new GiveSL.ShopSVC.ShopClient(lxBinding, lxAddress);
 }

4 个答案:

答案 0 :(得分:1)

如果服务托管在ASP.NET中,您还需要确保Web服务器的最大请求长度允许该大小的消息。例如:

<configuration>
  <system.web>
    <httpRuntime maxRequestLength="2147483647" />
  </system.web>
</configuration>

答案 1 :(得分:0)

一切看起来都不错,所以我想知道这是不是很简单。您正在更改配置的服务器是否与Silverlight客户端在https://web14.ai-host.com/Services/Shop.svc指向的服务器相同?此外,您可能希望尝试将完全相同的绑定配置从服务器配置粘贴到客户端的绑定配置。

答案 2 :(得分:0)

好的,这是另一次尝试。某些版本的Silverlight 2没有正确读取ClientConfig,因此通过代码在客户端绑定上设置MaxReceivedMessageSize来解决它。也许Silverlight 3有类似的问题。你能尝试通过代码设置MaxReceivedMessageSize吗?请参阅http://forums.silverlight.net/forums/t/11313.aspx

答案 3 :(得分:0)

最后一个解决方案......

存在两个潜在问题:

  1. 客户端上的绑定对象被错误地声明为System.ServiceModel.Channels.Binding,并且应该已声明为System.ServiceModel.BasicHttpBinding。因此,上面列出的函数是在Silverlight客户端中创建代理对象的正确代码。
  2. 必须是应用程序缓存对服务客户端的第一次调用。这段时间我一直在尝试解决方案,我只是更改了一个绑定调用,而且它不是我项目中调用的第一个调用。当我编写用于创建代理对象的中心函数时,在我将所有代码更改为使用该中心函数之前,它仍然无效。
  3. 现在我的所有代码都使用相同的函数来创建服务客户端代理,MaxReceivedMessageSize的设置得到了尊重,一切都很顺利。

    哇......只是没见过那个人。

    感谢所有人(尤其是雅各布)和我一起待这个。

    史蒂夫