C# WCF ProtocolException:错误请求400(与http消息大小相关)

C# WCF ProtocolException:错误请求400(与http消息大小相关),c#,wcf,base64,channel,webhttpbinding,C#,Wcf,Base64,Channel,Webhttpbinding,我正在尝试使用WebHttpBinding通过WCF传递base64编码的字符串 我得到了服务器没有响应的神秘错误“Bad Request 400”。我知道它与字符串的大小有关,因为如果我测试一个非常短的字符串(大约4KB),它可以工作,但是任何稍微高一点的都不行 我到处都读到,这与maxReceivedMessageSize或web.config中用于绑定的其他配置有关,但即使在客户端和服务器上更改了这些数字,我仍然会发现错误(换句话说,我已经阅读了很多关于这个确切问题的其他帖子,但它们似乎没

我正在尝试使用WebHttpBinding通过WCF传递base64编码的字符串

我得到了服务器没有响应的神秘错误“Bad Request 400”。我知道它与字符串的大小有关,因为如果我测试一个非常短的字符串(大约4KB),它可以工作,但是任何稍微高一点的都不行

我到处都读到,这与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
<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>
数据推送接收端的合同:

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

客户端web配置(引发错误的位置:)


您是否在IIS/ASP.NET中托管?如果是这样,您还必须增加它们的设置

对于你想要改变的IIS7


对于ASP.NET,您想更改。

我现在不知道,但是如果您为web服务设置跟踪,它可能会提供一些有关生成错误原因的有用信息。我有跟踪功能。没有看到任何明显的错误弹出,但我还不太热衷于如何浏览跟踪日志。我将进一步研究。这些都是在visual studio中使用本地开发服务器完成的。您是否尝试过设置它们?HttpRuntimeOne也会影响Cassini开发服务器。也就是说,在某个时候您会将其部署到IIS,对吗?因此,您也应该在其中获得system.webServer一个。我确实增加了httpRuntime maxRequestLength,但仍然得到相同的错误。好的,您是否启用了WCF跟踪以查看是否正在访问WCF?如果不是,您知道是HTTP级别拒绝了请求。您可以改为使用IIS或IISExpress进行测试吗?我的跟踪日志正在工作,并且肯定显示了大多数错误,但是此错误不会在服务器端的跟踪日志中产生错误(可能客户端发生了什么情况?)。我在服务器端跟踪中看到的唯一内容是一堆“构造ServiceHost”和“ASP.net托管服务激活消息”。跟踪日志服务器端没有错误。另外,这是一种稍微不寻常的情况,如果您注意到的话,客户机实际上正试图将大型数据集推送到服务器。也许这需要考虑一下?它不是通常的客户端从服务器中提取数据。
<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>