1

在这里找到答案(最后一篇文章):http ://social.msdn.microsoft.com/Forums/eu/wcf/thread/f5c0ea22-1d45-484e-b2c0-e3bc9de20915

我在实现我的自定义 ( TextOrMtomEncoder ) 时遇到了最后一个问题,即 ReaderQuotas 的实现。

我在网上搜索了很多,但我无法弄清楚最后一块拼图。

我有一个类,其中包含我对“BindingElementExtensionElement”和“MessageEncodingBindingElement”的实现。

MessageEncodingBindingElement 实现包含以下内容的覆盖:

T GetProperty<T>(BindingContext context)

我从默认的 .NET MessageEncoding 实现中“借用”了它,例如 TextMessageEncoding

这必须是正确的实现,因为 MSDN 是这么说的。

从 web.config 加载配置很好,我可以看到我的两个类中的 ReaderQuotas 属性设置正确,但看起来 .NET 没有从我的 MessageEncodingBindingElement 实现中读取 ReaderQuotas 配置。

我的猜测是 .NET 使用 GetProperty 方法来加载配置,因为 MessageVersion 是通过此方法请求的。但问题是,T 永远不会等于 XmlDictionaryReaderQuotas,因此 ReaderQuotas 永远不会开始请求。

我的问题的根源是奇怪的顺便说一句,我正在使用 IIS7.5 的 Windows 7 x64 机器上开发。在我的机器上发布“大”文件(如 100 KB)。但是当我将服务部署到 Windows Server 2008 R2(尝试了 2 个不同的服务器)时,我收到以下错误:

格式化程序在尝试反序列化消息时抛出异常:尝试反序列化参数 http://socialproxy.infocaster.net:argument时出错。InnerException 消息是“反序列化 System.Object 类型的对象时出错。读取 XML 数据时已超出最大数组长度配额 (16384)。可以通过更改创建 XML 阅读器时使用的 XmlDictionaryReaderQuotas 对象的 MaxArrayLength 属性来增加此配额。第 1 行,位置 1584.'。有关更多详细信息,请参阅 InnerException。

就像我说的,它可以在我的机器上运行:-/

谁能告诉我如何解决这个问题?

提前谢谢了!

WCF 服务配置:

<system.serviceModel>
    <extensions>
        <behaviorExtensions>
            <add name="wsdlExtensions" type="WCFExtras.Wsdl.WsdlExtensionsConfig, WCFExtras, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
            <add name="textOrMtomMessageBehavior" type="InfoCaster.SocialProxy.lib.TextOrMtom.TextOrMtomMessageBehavior, InfoCaster.SocialProxy" />
        </behaviorExtensions>
        <bindingElementExtensions>
            <add name="textOrMtomEncoding" type="InfoCaster.SocialProxy.lib.TextOrMtom.TextOrMtomEncodingElement, InfoCaster.SocialProxy" />
        </bindingElementExtensions>
    </extensions>
    <bindings>
        <customBinding>
            <binding name="TextOrMtomBinding">
                <textOrMtomEncoding messageVersion="Soap11">
                    <readerQuotas maxDepth="32" maxStringContentLength="5242880" maxArrayLength="204800000" maxBytesPerRead="5242880" maxNameTableCharCount="5242880" />
                </textOrMtomEncoding>
                <httpTransport maxBufferSize="5242880" maxReceivedMessageSize="5242880" transferMode="Buffered" authenticationScheme="Anonymous" />
            </binding>
        </customBinding>
    </bindings>
    <services>
        <clear />
        <service name="InfoCaster.SocialProxy.SocialProxy" behaviorConfiguration="InfoCaster.SocialProxy.ISocialProxyServiceBehavior">
            <endpoint name="SocialProxyServiceEndpoint" address="" binding="customBinding" bindingConfiguration="TextOrMtomBinding" contract="InfoCaster.SocialProxy.ISocialProxy" behaviorConfiguration="InfoCaster.SocialProxy.ISocialProxyEndpointBehavior" />
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <clear />
            <behavior name="InfoCaster.SocialProxy.ISocialProxyServiceBehavior">
                <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
                <serviceMetadata httpGetEnabled="true" />
                <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
                <serviceDebug includeExceptionDetailInFaults="true" />
            </behavior>
        </serviceBehaviors>
        <endpointBehaviors>
            <clear />
            <behavior name="InfoCaster.SocialProxy.ISocialProxyEndpointBehavior">
                <textOrMtomMessageBehavior />
            </behavior>
        </endpointBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
4

1 回答 1

1

在这里找到答案(最后一篇文章):http ://social.msdn.microsoft.com/Forums/eu/wcf/thread/f5c0ea22-1d45-484e-b2c0-e3bc9de20915

好的,我找到了。您必须将 readerquotes 传递给标准编码器。不幸的是,这里没有构造函数,所以你必须设置属性。

class TextOrMtomEncoder : MessageEncoder   {
    MessageEncoder _textEncoder;
    MessageEncoder _mtomEncoder;
    public TextOrMtomEncoder(MessageVersion messageVersion, XmlDictionaryReaderQuotas readerQuotas)
    {
      TextMessageEncodingBindingElement textEncoderBindingElement = new TextMessageEncodingBindingElement(messageVersion, Encoding.UTF8);
      MtomMessageEncodingBindingElement mtomEncoderBindingElement = new MtomMessageEncodingBindingElement(messageVersion, Encoding.UTF8);

      readerQuotas.CopyTo(mtomEncoderBindingElement.ReaderQuotas);
      readerQuotas.CopyTo(textEncoderBindingElement.ReaderQuotas);

      _mtomEncoder = mtomEncoderBindingElement.CreateMessageEncoderFactory().Encoder;
      _textEncoder = textEncoderBindingElement.CreateMessageEncoderFactory().Encoder;
    }
于 2012-05-11T14:21:38.453 回答