WCF ProtocolException: неверный запрос 400 (связан с размером сообщения http) - PullRequest
3 голосов
/ 09 июня 2011

Я пытаюсь передать закодированную 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; }
}

Контракты для принимающей стороны передачи данных:

[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>

1 Ответ

1 голос
/ 09 июня 2011

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

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

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

...