1

对于大于 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>

银光客户端

<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

4 回答 4

1

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

<configuration>
  <system.web>
    <httpRuntime maxRequestLength="2147483647" />
  </system.web>
</configuration>
于 2010-01-29T18:21:45.383 回答
0

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

于 2010-01-30T18:09:01.850 回答
0

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

于 2010-01-30T20:57:21.810 回答
0

终于有办法了...

有两个潜在的问题:

  1. 客户端上的绑定对象被错误地声明为 System.ServiceModel.Channels.Binding,应该被声明为 System.ServiceModel.BasicHttpBinding。因此,上面列出的函数是在 Silverlight 客户端中创建代理对象的正确代码。
  2. 必须是应用程序缓存了对服务客户端的第一次调用。一直以来,我一直在尝试解决方案,我只更改了一个绑定调用,而且它不是我项目中的第一个调用。当我编写用于创建代理对象的中心函数时,它仍然无法工作,直到我更改所有代码以使用该中心函数。

现在我的所有代码都使用相同的函数来创建服务客户端代理,MaxReceivedMessageSize 的设置受到尊重,一切都很好。

哇...只是从未见过那个来的。

感谢大家(尤其是雅各布)和我一起讨论这个问题。

史蒂夫

于 2010-02-12T17:57:23.053 回答