3

我正在使用 .NET 4 RC 在 IIS 中托管 WCF REST 服务。对服务的 POST 调用使用 JSON 进行序列化。一切正常,直到其中一个 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.Runtime.Serialization.Json.DataContractJsonSerializer.ReadObject(XmlDictionaryReader reader, Boolean verifyObjectName) 在 System.ServiceModel 的 System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver)。 Dispatcher.SingleBodyParameterMessageFormatter。

4

3 回答 3

2

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

我会将其归档在 WCF 的错误下,因为:

  1. 应禁止相对 URL(并引发适当的异常)

或者

  1. 读者配额也应该适用于相对路径
于 2010-02-15T20:45:13.337 回答
1

插入您的 web.config:

<configuration>
  <system.serviceModel>
    <bindings>
      <webHttpBinding>
        <binding name="webHttpBindingConfig">
          <readerQuotas maxStringContentLength="2048000" />
        </binding>
      </webHttpBinding>
    </bindings>
  </system.serviceModel>
</configuration>

并将属性 bindingConfiguration="webHttpBindingConfig" 插入您的端点

于 2011-12-23T08:05:29.670 回答
0

我有类似的问题,但使用 .NET 3.5

我在服务器日志上没有问题,所以问题出在客户端上。 似乎没有读取和使用最大值增加的配置......

因此,我使用另一个重载解决了在 WebChannelFactory 的构造函数中明确传递端点名称的问题。

曾是:

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

于 2013-04-17T08:41:23.507 回答