Код состояния 413 (RequestEntityTooLarge) / Код состояния 415 (UnsupportedMediaType).WCF программно - PullRequest
0 голосов
/ 04 мая 2019

Я вызываю веб-службу WCF программно, генерируя файлы классов через SvcUtil.exe.

Все работает нормально, но когда я пытаюсь отправить изображение (буквально файл с размером большечем 200 КБ), я получаю эту ошибку.

Я знаю, что мне нужно увеличить maxReceivedMessageSize и maxBufferPoolSize до максимума, чтобы отправлять большие файлы в службу WCF.Следовательно, XML-версия этого будет выглядеть следующим образом:

<binding name="SampleBinding" allowCookies="true" messageEncoding="Mtom" maxReceivedMessageSize="20000000" maxBufferSize="20000000" maxBufferPoolSize="20000000">
  <readerQuotas maxDepth="32" maxArrayLength="200000000" maxStringContentLength="200000000"/>
  <security mode="None">
    <transport proxyCredentialType="Basic"/>
  </security>
</binding>

В этом приложении, поскольку я использую файлы классов, сгенерированные SvcUtil, мне нужно программно вызывать мой метод службы WCF.

Я так и сделал,

var binding = new BasicHttpBinding();
binding.MaxReceivedMessageSize = binding.MaxBufferPoolSize = long.MaxValue;
binding.AllowCookies = true;
binding.ReaderQuotas = new System.Xml.XmlDictionaryReaderQuotas();
binding.ReaderQuotas.MaxArrayLength = binding.ReaderQuotas.MaxBytesPerRead = int.MaxValue;
binding.ReaderQuotas.MaxStringContentLength = binding.ReaderQuotas.MaxNameTableCharCount = int.MaxValue;
binding.ReaderQuotas.MaxDepth = int.MaxValue;

webAPI = new WebAPIClient(binding, new EndpointAddress(soapUrl));

Версия XML работает очень хорошо, но версия C # завершилась неудачно с трассировкой ниже стека:

Произошла ошибка при обработке веб-запроса: Состояниекод 413 (RequestEntityTooLarge): слишком большой объект запроса

EDIT

Мне предложили использовать пользовательское связывание.Ниже приведен мой пользовательский код привязки:

CustomBinding binding = new CustomBinding()
{
    Name = "SampleBinding",
    ReceiveTimeout = new TimeSpan(0, 0, 10, 0, 0),
    SendTimeout = new TimeSpan(0, 0, 10, 0, 0),
};
var element1 = new TextMessageEncodingBindingElement()
{
    ReaderQuotas = new System.Xml.XmlDictionaryReaderQuotas()
    {
        MaxDepth = 2147483647,
        MaxStringContentLength = 2147483647,
        MaxArrayLength = 2147483647,
        MaxBytesPerRead = 2147483647,
        MaxNameTableCharCount = 2147483647
    }
};
var element2 = new HttpTransportBindingElement()
{
    ManualAddressing = false,
    MaxReceivedMessageSize = 2147483647,
    AllowCookies = false,
    AuthenticationScheme = System.Net.AuthenticationSchemes.None,
    BypassProxyOnLocal = false,
    MaxBufferSize = 2147483647,
    ProxyAuthenticationScheme = System.Net.AuthenticationSchemes.None,
    TransferMode = TransferMode.Buffered,
    UseDefaultWebProxy = true
};
var element3 = new TextMessageEncodingBindingElement(MessageVersion.Soap12WSAddressing10, System.Text.Encoding.UTF8);

binding.Elements.Add(element1);
binding.Elements.Add(element2);
binding.Elements.Add(element3);

webAPI = new WebAPIClient(binding, new EndpointAddress(soapUrl));

Произошла ошибка при обработке веб-запроса: Код состояния 415 (UnsupportedMediaType): невозможно обработать сообщение, так как тип содержимого 'application / soap + xml;charset = utf-8 'не был ожидаемым типом' text / xml;charset = utf-8 '.

Я не знаю, что не так.Вы можете мне помочь?

1 Ответ

0 голосов
/ 09 мая 2019

Я только что нашел ответ и разместил его здесь для будущих пользователей, у которых может быть та же проблема, что и у меня:

Мой клиент звонит

webAPI = new WebAPIClient(new BasicHttpBinding(), new EndpointAddress(_urlString);

Конфигурация сервера для службы WCF

<endpoint address="url/WebAPI.svc" binding="basicHttpBinding" contract="MyContract.IWebAPI" />

<bindings>
  <basicHttpBinding>
    <binding maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Text">
      <readerQuotas maxDepth="2000000" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
    </binding>
  </basicHttpBinding>
</bindings>

Как видите, я не упомянул здесь никакого имени для конфигурации привязки, и она просто работала как шарм.

Ответ, вдохновленный этим SO-ответом

...