[英]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.