WCF ProtocolException: неверный запрос 400 (относится к размеру http-сообщения)

Я пытаюсь передать строку в кодировке base64 через WCF, используя WebHttpBinding.

Я получаю загадочную ошибку «Bad Request 400», что сервер не отвечает. Я знаю, что это связано с размером строки, потому что, если я тестирую очень короткую строку (около 4 КБ или около того), она работает, а что-то даже немного выше - нет.

Я везде читал, что это связано с maxReceivedMessageSize или другой конфигурацией в web.config для привязки, но даже после изменения этих цифр как на клиенте, так и на сервере я все еще получаю сообщение об ошибке (другими словами, я прочитал много других сообщения об этой конкретной проблеме, но они, похоже, не помогли?)

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

static IHttpDataPush push = new HttpDataPush();

var wcfClient = ChannelHelperExtensions.WebHttpChannel<IHttpDataRcv>("http://localhost:3941/HttpRcv");

        var args = wcfClient.OptionArgs();

        foreach (var v in args)
        {
            HttpTransactionDataArgs uid = push.Option(v.Entity, v.Option, v.Key);

            wcfClient.ResponseNotification(uid); <-- error thrown at this line

Это мои сервисные контракты/контракты данных:

[ServiceContract]
public interface IHttpDataPush
{
    [OperationContract]
    HttpTransactionDataArgs DbRequest(HttpTransactionOptionArgs args);

    [OperationContract]
    [WebGet]
    HttpTransactionDataArgs DbOption(string entity, string option, string key);
}

[DataContract]
[KnownType(typeof(HttpTransactionDataArgs))]
public class HttpTransactionDataArgs
{
    [DataMember]
    public string EntityName { get; set; }

    [DataMember]
    public string Base64Schema { get; set; }

    [DataMember]
    public string Base64Data { get; set; }

    [DataMember]
    public bool TransactionSuccessful { get; set; }
}

Контракты для получателя данных push:

[ServiceContract]
public interface IHttpDataRcv
{
    [OperationContract]
    HttpTransactionOptionArgs[] OptionArgs();

    [OperationContract]
    bool ResponseNotification(HttpTransactionDataArgs args);
}

[DataContract]
[KnownType(typeof(HttpTransactionOptionArgs))]
public class HttpTransactionOptionArgs
{
    [DataMember]
    public string Entity { get; set; }

    [DataMember]
    public string Option { get; set; }

    [DataMember]
    public string Key { get; set; }
}

Серверный web.config:

<bindings>
  <webHttpBinding>
    <binding name="webHttpConfig" closeTimeout="00:20:00" openTimeout="00:20:00"
        receiveTimeout="00:20:00" sendTimeout="00:20:00"
        maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" >
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647"
          maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
    </binding>

<endpoint address="/HttpRcv" behaviorConfiguration="REST" bindingConfiguration="webHttpConfig" binding="webHttpBinding" contract="EmailContracts.IHttpDataRvc" />

Веб-конфигурация на стороне клиента (где выдается ошибка:)

<client>
  <endpoint address="http://localhost:3941/HttpRcv"
            binding="webHttpBinding"
            bindingConfiguration="webHttpConfig"
            contract="EmailContracts.IHttpDataRcv" />
</client>

    <bindings>
  <webHttpBinding>
    <binding name="webHttpConfig" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647">
      <readerQuotas maxStringContentLength="2147483647" maxArrayLength="2147483647" 
                    maxDepth="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
    </binding>      
  </webHttpBinding>
</bindings>

person Sean Thoman    schedule 08.06.2011    source источник
comment
Я не знаю навскидку, но если вы настроите трассировку для веб-службы, это может дать некоторую полезную информацию о том, почему возникла ошибка.   -  person regex    schedule 09.06.2011
comment
У меня есть отслеживание. Я не видел каких-либо явных ошибок, но я пока не слишком заинтересован в том, как перемещаться по журналу трассировки. Я посмотрю на это дальше.   -  person Sean Thoman    schedule 09.06.2011


Ответы (1)


Вы размещаете в IIS/ASP.NET? Если это так, вы также должны увеличить их настройки.

Для IIS7 вы хотите изменить system.webServer/security/requestFiltering/requestLimits/@maxAllowedContentLength.

Для ASP.NET вы хотите изменить system.web/httpRuntime/@maxRequestLength< /а>.

person Drew Marsh    schedule 09.06.2011
comment
Это все в Visual Studio, используя локальный сервер разработки. - person Sean Thoman; 09.06.2011
comment
Вы пробовали их ставить? httpRuntime также повлияет на сервер разработки Cassini. Тем не менее, в какой-то момент вы развернете это в IIS, верно? Таким образом, вы также должны получить туда system.webServer. - person Drew Marsh; 09.06.2011
comment
Я увеличил httpRuntime maxRequestLength, но все равно получаю ту же ошибку. - person Sean Thoman; 09.06.2011
comment
Хорошо, вы включили трассировку WCF, чтобы увидеть, достигается ли вообще доступ к WCF? Если это не так, вы знаете, что это уровень HTTP, который отклоняет запрос. Можете ли вы перейти на использование IIS или IISExpress для тестирования? - person Drew Marsh; 09.06.2011
comment
Мой журнал трассировки работает и определенно показывает большинство ошибок, однако эта ошибка не приводит к ошибке в журнале трассировки на стороне сервера (может быть, что-то происходит на стороне клиента?). Единственное, что я вижу в трассировках на стороне сервера, - это набор сообщений «Construct ServiceHost» и «ASP.net hosted service активированных сообщений». Нет ошибок на стороне сервера журнала трассировки. Кроме того, это немного необычная ситуация, поскольку клиент на самом деле пытается отправить большой набор данных на сервер, если вы заметили. Может, это нужно учитывать? Это не обычный клиент, извлекающий данные с сервера. - person Sean Thoman; 09.06.2011
comment
На самом деле, если подумать, я думаю, что обнаружил ошибку на стороне сервера: System.ServiceModel.ProtocolException: превышена квота на максимальный размер сообщения для входящих сообщений (65536). Чтобы увеличить квоту, используйте свойство MaxReceivedMessageSize соответствующего элемента привязки. - person Sean Thoman; 09.06.2011
comment
Ну вот. Таким образом, указанная вами привязка на самом деле не применяется к вашей службе. - person Drew Marsh; 10.06.2011