Настройка службы Silverlight 3 wcf - ошибка maxreceivedmessagesize - PullRequest
1 голос
/ 29 января 2010

Я получаю сообщение об ошибке maxreceivedmessagesize для сообщений размером более 64 КБ. Проблема в том, что я уже все изменил как на сервере, так и на клиенте, и это не решает проблему.

вот мой 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 ]

1 голос
/ 29 января 2010

Если служба размещается в ASP.NET, вы также должны убедиться, что максимальная длина запроса для веб-сервера учитывает сообщения такого размера. Например:

<configuration>
  <system.web>
    <httpRuntime maxRequestLength="2147483647" />
  </system.web>
</configuration>
0 голосов
/ 12 февраля 2010

Наконец решение ...

Были две основные проблемы:

  1. Объект привязки на стороне клиента был неправильно объявлен как System.ServiceModel.Channels.Binding и должен был быть объявлен как System.ServiceModel.BasicHttpBinding. Итак, перечисленная выше функция является правильным кодом для создания прокси-объекта в клиенте Silverlight.
  2. Должно быть так, что самое первое обращение к клиенту службы кэшируется приложением. Все это время я пытался найти решение, менял только один из связывающих вызовов, и это был не первый вызов в моем проекте. Когда я написал центральную функцию для создания прокси-объекта, она все еще не работала, пока я не изменил весь свой код везде, чтобы использовать эту центральную функцию.

Теперь, когда весь мой код использует одну и ту же функцию для создания прокси клиента службы, настройка MaxReceivedMessageSize соблюдается и все в порядке.

Ух ты ... просто никогда не видел, чтобы это пришло.

Спасибо всем (особенно Джейкобу) за то, что повесили меня на этот раз.

Steve

0 голосов
/ 30 января 2010

ОК, вот еще одна попытка. Некоторые версии Silverlight 2 не читали ClientConfig должным образом, поэтому его можно было обойти, установив MaxReceivedMessageSize для привязки клиента через код. Возможно, Silverlight 3 имеет похожую проблему. Не могли бы вы попробовать установить MaxReceivedMessageSize через код? Смотри http://forums.silverlight.net/forums/t/11313.aspx.

0 голосов
/ 30 января 2010

Все выглядит хорошо для меня, поэтому мне интересно, если это что-то простое. Является ли сервер, на котором вы меняете конфигурацию, тем же, на который клиент Silverlight указывает на https://web14.ai-host.com/Services/Shop.svc? Кроме того, вы можете попробовать вставить точно такую ​​же конфигурацию привязки из конфигурации сервера в конфигурацию привязки клиента.

...