使用JSON调用WCF REST服务时出错。超出限额(8192)

时间:2010-02-13 14:13:00

标签: wcf json rest maxstringcontentlength

我正在使用.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)“

3 个答案:

答案 0 :(得分:2)

这很有效,只需确保将完整的绝对URL作为您的终端地址。如果你变得狡猾,并尝试使用相对路径,或者如果省略.svc,一旦请求变得太大,它将会弹出奇怪的读者配额错误 -

我会在WCF的Bug下提交此文件,因为:

  1. 应禁止相对URL(并抛出适当的异常)
    1. 读者配额也应该与相对路径一起使用

答案 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等等,所以所有新增加的限制现在都有效。