繁体   English   中英

WCF中的自定义消息编码器,支持ReaderQuotas

[英]Custom Message Encoder in WCF with support for ReaderQuotas

在这里找到答案(最新文章): 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>

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

好的,我找到了。 您必须将阅读器引号传递给标准编码器。 不幸的是,此方法没有构造函数,因此必须设置属性。

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;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM