我正在使用.NET 4 RC在IIS中托管WCF REST服务。使用JSON序列化对服务的POST调用。一切正常,直到其中一个DataMember(字符串)的大小超过8K。在这种情况下,我收到下面描述的错误,表明已超过MaxStringContentLength。 endPoint的maxStringContentLength属性已增加,并且可以从配置文件中正确读取。
网络配置是:
<services>
<service name="MyServiceServer" >
<endpoint address="http://localhost/MyService" kind="webHttpEndpoint" endpointConfiguration="serviceEndPoint" contract="IMyService">
</endpoint>
</service>
</services>
<standardEndpoints>
<webHttpEndpoint>
<standardEndpoint name="serviceEndPoint" maxReceivedMessageSize="2048000" maxBufferSize="2048000" maxBufferPoolSize="0">
<readerQuotas maxStringContentLength="2048000" maxArrayLength="2048000" maxDepth ="65000"/>
<security mode="None">
<transport clientCredentialType="None"/>
</security>
</standardEndpoint>
</webHttpEndpoint>
</standardEndpoints>
IMyService接口定义为:
public interface IMyService
{
[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "/request", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
void MyMehod(<Class Type> obj);
}
完整的错误消息是:
“服务器在处理请求时遇到错误。异常消息是“反序列化类型的对象时出错”。读取XML数据时已超出最大字符串内容长度配额(8192)。通过更改创建XML阅读器时使用的XmlDictionaryReaderQuotas对象的MaxStringContentLength属性,可以增加此配额。请参阅服务器日志以获取更多详异常堆栈跟踪是:位于System.ServiceModel处的System.Runtime.Serialization.Json.DataContractJsonSerializer.ReadObject(XmlDictionaryReader reader,Boolean verifyObjectName)中的System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader,Boolean verifyObjectName,DataContractResolver dataContractResolver)。 System.ServiceModel.Dispatcher.UriTemplateDispatchFormatter.DeserializeRequest(消息消息,Object [])上的System.ServiceModel.Dispatcher.DemultiplexingDispatchMessageFormatter.DeserializeRequest(消息消息,Object []参数)中的Dispatcher.SingleBodyParameterMessageFormatter.DeserializeRequest(消息消息,Object []参数) system.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&amp; rpc)System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageR)上System.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs(MessageRpc&amp; rpc)的System.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs(MessageRpc&amp; rpc) PC和放大器; rpc)at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc&amp; rpc)at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)“
答案 0 :(得分:2)
这很有效,只需确保将完整的绝对URL作为您的终端地址。如果你变得狡猾,并尝试使用相对路径,或者如果省略.svc,一旦请求变得太大,它将会弹出奇怪的读者配额错误 -
我会在WCF的Bug下提交此文件,因为:
或
答案 1 :(得分:1)
插入您的web.config:
<configuration>
<system.serviceModel>
<bindings>
<webHttpBinding>
<binding name="webHttpBindingConfig">
<readerQuotas maxStringContentLength="2048000" />
</binding>
</webHttpBinding>
</bindings>
</system.serviceModel>
</configuration>
并将属性bindingConfiguration =“webHttpBindingConfig”插入到您的端点
答案 2 :(得分:0)
我有类似的问题,但使用.NET 3.5
我在服务器日志上没有问题,所以问题出在客户端上。 似乎没有读取和使用最大值增加的配置 ...
所以我解决了使用另一个重载在WebChannelFactory的构造函数中传递端点名称的问题。
WAS:
WebChannelFactory<IWKRestTest> factory = new WebChannelFactory<IWKRestTest>(new Uri(XXX));
factory.Credentials.UserName.UserName = K_USERNAME;
factory.Credentials.UserName.Password = K_PASSWORD;
IWKRestTest proxy = factory.CreateChannel();
时:
WebChannelFactory<IWKRestTest> factory = new WebChannelFactory<IWKRestTest>("IWKRestTestService");
并在app.config中有:
Uri在端点节点中指示,但在那里你也找到了bindingConfiguration等等,所以所有新增加的限制现在都有效。