1

我有一个 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>

好的!

当我调用 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);
  }
}

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

当我尝试使用大消息(小消息没问题)执行我的服务时,我得到:

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

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

请帮我。谢谢

4

1 回答 1

1

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

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

由于您在 WebServs 目录(根目录)上方的目录中为服务进行了所有配置,所以它可能使用了默认端点?我确实意识到 Web.config 文件将从上述文件继承,但如果您还没有考虑的话,至少要考虑这一点。

可以在此处找到有关 4.0 的默认端点和其他更改的更多信息: Windows Communication Foundation 4 的开发人员简介

于 2011-10-15T21:15:01.877 回答