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

Posted

技术标签:

【中文标题】WCF ProtocolException:错误请求 400(与 http 消息大小有关)【英文标题】:WCF ProtocolException : Bad Request 400 (related to http message size) 【发布时间】:2011-09-11 07:11:13 【问题描述】:

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

我收到服务器未响应的神秘错误“错误请求 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

这些是我的服务合同/数据合同:

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

【问题讨论】:

我不知道,但如果您为 Web 服务设置跟踪,它可能会提供一些有用的信息来说明为什么会生成错误。 我有追踪。没有看到任何明显的错误弹出,但我不太热衷于如何浏览跟踪日志。我会进一步调查。 【参考方案1】:

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

对于 IIS7,您要更改 the system.webServer/security/requestFiltering/requestLimits/@maxAllowedContentLength

对于 ASP.NET,您想更改 the system.web/httpRuntime/@maxRequestLength

【讨论】:

这一切都在 Visual Studio 中,使用本地开发服务器。 您是否尝试设置它们? httpRuntime 也将影响 Cassini 开发服务器。也就是说,在某些时候您会将其部署到 IIS,对吗?所以你也应该把 system.webServer 放在那里。 我确实增加了 httpRuntime maxRequestLength,但仍然得到同样的错误。 好的,您是否启用了 WCF 跟踪以查看是否已达到 WCF?如果不是,您知道是 HTTP 级别拒绝了请求。可以改用IIS或者IISExpress来测试吗? 我的跟踪日志正在工作,并且肯定会显示大多数错误,但是此错误不会在服务器端的跟踪日志中产生错误(也许客户端发生了某些事情?)。我在服务器端跟踪中看到的唯一内容是一堆“构造服务主机”和“ASP.net 托管服务激活消息”。跟踪日志服务器端没有错误。这也是一个稍微不寻常的情况,如果您注意到,客户端实际上正在尝试将大型数据集推送到服务器。也许这需要考虑?它不是通常的客户端从服务器中提取数据。

以上是关于WCF ProtocolException:错误请求 400(与 http 消息大小有关)的主要内容,如果未能解决你的问题,请参考以下文章

使用 WCF Web 服务时获取 System.ServiceModel.ProtocolException

带有 ChannelFactory 的 WCF 客户端,方法返回 ProtocolException / 405 Method not Allowed

ProtocolException Unhandled/(405) WCF 不允许的方法;绑定和端点看起来不错

WCF 请求返回错误响应

WCF 协议异常

获取“java.net.ProtocolException:服务器重定向太多次”错误