WCF ProtocolException:错误请求 400(与 http 消息大小相关)
我正在尝试使用 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" />
客户端 Web 配置(抛出错误的地方:)
<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>
I am trying to pass a base64 encoded string over WCF using WebHttpBinding.
I get the cryptic error 'Bad Request 400' that the server is not responding. I know its related to the size of the string because if I test a very short string (around 4KB or so) it works, but anything even slightly higher does not.
I've read everywhere that this is related to the maxReceivedMessageSize or other configuration in web.config for the binding, but even after changing those figures on both the client AND server I still get the error (in other words I have read alot of other posts about this exact problem but they didnt seem to help?)
Ive confirmed that everything is working properly up to the last line of the following code where the error is thrown:
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
These are my service contracts / data contracts:
[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; }
}
Contracts for the receiving end of the data 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; }
}
Server-side 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-side web config (where the error is thrown:)
<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,您想要更改
system.webServer/security/requestFiltering /requestLimits/@maxAllowedContentLength
。对于 ASP.NET,您想要更改
system.web/httpRuntime/@maxRequestLength
。Are you hosting in IIS/ASP.NET? If so you must also increase their settings as well.
For IIS7 you want to change the
system.webServer/security/requestFiltering/requestLimits/@maxAllowedContentLength
.For ASP.NET you want to change the
system.web/httpRuntime/@maxRequestLength
.