WCF MaxReceivedMessageSize не будет обновляться при изменении в файле web.config. - PullRequest
0 голосов
/ 30 ноября 2011

Я посмотрел в Интернете, и ни одно из решений этой проблемы, похоже, не работает для меня.У меня есть служба WCF, используемая приложением Silverlight.Все работает нормально, пока я не попытаюсь обновить большой граф объектов.Мои журналы трассировки приветствуют меня прекрасной ошибкой:

Превышена квота максимального размера сообщения для входящих сообщений (65536).Чтобы увеличить квоту, используйте свойство MaxReceivedMessageSize для соответствующего элемента привязки.

Я изменил настройку как в моем файле web.config, так и в файле ClientConfig Silverlight и даже попытался создать прокси вручнуюи установка значения в коде.

Мой web.config:

  <system.serviceModel>
    <diagnostics>
      <messageLogging logMalformedMessages="true" logMessagesAtTransportLevel="true" />
      <endToEndTracing propagateActivity="true" activityTracing="true"
             messageFlowTracing="true" />
    </diagnostics>
    <bindings>
      <basicHttpBinding>
        <binding name="basicHttpBindingSettings" closeTimeout="00:10:00" openTimeout="00:10:00" sendTimeout="00:10:00" 
                 maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" messageEncoding="Text">
          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" 
                        maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
        </binding>
      </basicHttpBinding>
    </bindings>
    <services>
      <service name="TestConfigService">
        <endpoint address="" contract="PreferencesUI.Hub.PreferenceSVC.ITestConfig" binding="basicHttpBinding"
                  bindingConfiguration="basicHttpBindingSettings" />
      </service>
    </services>
  </system.serviceModel>

Мой Silverlight:

        EndpointAddress ea = new EndpointAddress("http://localhost:37935/TestConfig.svc");


        BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.None);
        binding.CloseTimeout = new TimeSpan(00, 5, 00);
        binding.OpenTimeout = new TimeSpan(00, 5, 00);
        binding.ReceiveTimeout = new TimeSpan(00, 5, 00);
        binding.SendTimeout = new TimeSpan(00, 5, 00);
        binding.TextEncoding = System.Text.Encoding.UTF8;
        binding.MaxReceivedMessageSize = int.MaxValue;
        binding.MaxBufferSize = int.MaxValue;


        _preferenceTSTServiceProxy = new TSTC.TestConfigClient(binding, ea);

Кто-нибудь видит то, что я здесь пропустил?Все, что я нахожу в Интернете, указывает на то, что кто-то забыл либо установить maxReceivedMessageSize, либо забыл дать конечной точке значение имени bindingConfiguration (и то, и другое я сделал).

1 Ответ

0 голосов
/ 30 ноября 2011

Uggh. Я ненавижу этот конкретный аспект WCF. Это излишне сложно понять и трудно понять правильно.

Я не претендую на то, что понимаю все это, но я знаю, что есть и другие места, где можно установить свойство MaxReceivedMessageSize, помимо самой привязки. Также попробуйте основной транспорт, например, так:

    <binding name="CustomBinding_IRoomService">
      <httpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
    </binding>

Или вот так:

private void AddNetTcpEndpoint()
{
    var binaryMessageEncodingTcp = new BinaryMessageEncodingBindingElement
    {
        MaxSessionSize = ushort.MaxValue
    };
    binaryMessageEncodingTcp.ReaderQuotas.MaxDepth = ushort.MaxValue;
    var tcpDuplexBinding = new CustomBinding(
        binaryMessageEncodingTcp,
        new TcpTransportBindingElement {MaxReceivedMessageSize = int.MaxValue, MaxBufferSize = int.MaxValue}
        );
    tcpDuplexBinding.SendTimeout = TimeSpan.FromMinutes(2);
    tcpDuplexBinding.ReceiveTimeout = TimeSpan.FromMinutes(30);
    tcpDuplexBinding.OpenTimeout = TimeSpan.FromSeconds(30);
    tcpDuplexBinding.CloseTimeout = TimeSpan.FromSeconds(30);

    AddServiceEndpoint(
        typeof (IRoomService),
        tcpDuplexBinding,
        "tcpDuplex").Behaviors.Add(new SilverlightFaultBehavior());
        }
}

И могут быть и другие места.

...