ASP.NET应用程序中readerQuotas的问题

时间:2011-10-15 15:20:27

标签: asp.net wcf web-services readerquotas

我有一个ASP.NET 4.0应用程序。

使用链接源(服务实现)的.svc文件托管Web服务。 Web服务.svc文件位于应用程序根目录WebServs中的目录MyApp/WebServs/mysvc.svc内。

使用Web.config(在根目录中)设置Web服务。

<!-- Service model -->
<system.serviceModel>
  <services>
    <service name="DataAccessService">
      <endpoint address=""
                binding="basicHttpBinding"
                bindingConfiguration="basicHttpBinding_ISRV"
                contract="MyNamespace.ISRV">
      </endpoint>
    </service>
  </services>

  <bindings>
    <basicHttpBinding>
      <binding name="basicHttpBinding_ISRV" maxReceivedMessageSize="2147483647">
        <readerQuotas maxStringContentLength="1310720" 
                      maxArrayLength="16384" 
                      maxBytesPerRead="24096" 
                      maxDepth="10000" 
                      maxNameTableCharCount="16384"/>
      </binding>
    </basicHttpBinding>
  </bindings>
  <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>

OK!

当我调用Web服务时,我使用例程创建通道以封装这个常用的逻辑:

public static ISRV GetService() {
  try {
    // Create the service endpoint
    BasicHttpBinding bhttpb = new BasicHttpBinding(
      BasicHttpSecurityMode.TransportCredentialOnly);
    bhttpb.MaxReceivedMessageSize = 2147483647;
    bhttpb.ReaderQuotas = new System.Xml.XmlDictionaryReaderQuotas();
    bhttpb.ReaderQuotas.MaxArrayLength = 16384);
    bhttpb.ReaderQuotas.MaxBytesPerRead = 24096);
    bhttpb.ReaderQuotas.MaxDepth = 10000);
    bhttpb.ReaderQuotas.MaxNameTableCharCount = 16384);
    bhttpb.ReaderQuotas.MaxStringContentLength = 1310720);

    ServiceEndpoint httpEndpoint =
      new ServiceEndpoint(
        ContractDescription.GetContract(typeof(ISRV)),
        bhttpb,
        new EndpointAddress());

    // Create channel factory and get proper channel for service.
    ChannelFactory<ISRV> channelFactory = new ChannelFactory<ISRV>(httpEndpoint);

    IDAS svc = channelFactory.CreateChannel();

    return svc;
  } catch (Exception e) {
    throw new DASException("DAS Exception: " + e.Message);
  }
}

此例程由客户端调用。 Whilke Web.config用于配置服务服务器端。

当我尝试使用大型消息执行我的服务时(一切都是微小的消息)我得到:

  

格式化程序在尝试反序列化时抛出异常   消息:尝试反序列化参数时出错   http://((Namespace)):((Operation))。 InnerException消息   是'反序列化类型的对象时出错   ((类型)),   App_Code.s5qoir2n,Version = 0.0.0.0,Culture = neutral,   公钥=空]。最大字符串内容长度配额(8192)   读取XML数据时已超出。这个配额可能会增加   通过更改上的MaxStringContentLength属性   创建XML阅读器时使用的XmlDictionaryReaderQuotas对象。   第31行,位置1309.'。有关详细信息,请参阅InnerException。

不明白。服务和客户端都有共同的设置,这会读取defaut值?????此外,我做了很多其他用户按照StackOverflow中的说明进行操作。

请帮帮我。三江源

1 个答案:

答案 0 :(得分:1)

您指定了WCF 4.0(确切地说,ASP.NET 4.0),所以我想知道您遇到的问题是您实际上是否正在访问默认端点,默认端点将使用绑定的默认值,除非否则被覆盖?

WCF 4.0将提供默认端点(设置为服务所在的位置)。该默认端点很可能使用绑定的默认值(在MaxStringContentLength的情况下为8192)。

由于您在WebServs目录(根目录)上方的目录中对服务进行了所有配置,可能是它采用了默认端点?我确实知道Web.config文件将继承上面的文件,但如果你还没有,至少要考虑这个问题。

有关默认端点和4.0的其他更改的更多信息,请访问:A Developer's Introduction to Windows Communication Foundation 4