我使用动态代理工厂来通过 wsdl 字符串路径调用任何 Web 服务。不幸的是,当 Web 服务应答大量数据时,会引发异常:
System.ServiceModel.CommunicationException: Le quota de taille maximale autorisée 倒消息 参赛者 (65536( A été dépassé.Pour augmenter le quota, utilisez la propriété MaxReceivedMessageSize sur l'élément de la liaison appropriée.---> System.ServiceModel.QuotaExceededException: Le quota de taille maximale autorisée 倒消息 参赛者 (65536( A été dépassé.Pour augmenter le quota, utilisez la propriété MaxReceivedMessageSize sur l'élément de la liaison appropriée. ---鳍 De la trace de la pile d'exception 实习医师---
服务器堆栈跟踪:à System.ServiceModel.Channels.HttpInput.ThrowMaxReceivedMessageSizeExceeded(( à System.ServiceModel.Channels.HttpInput.GetMessageBuffer(( à System.ServiceModel.Channels.HttpInput.ReadBufferedMessage(Stream inputStream( à System.ServiceModel.Channels.HttpInput.ParseIncomingMessage(Exception& requestException( à System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan 超时( à System.ServiceModel.Channels.RequestChannel.Request(Message 消息, 时间跨度超时( à System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message 消息, 时间跨度超时( à System.ServiceModel.Channels.ServiceChannel.Call(String 动作, 布尔单向, 代理操作运行时操作, Object[] ins, Object[] outs, TimeSpan 超时( à System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime 操作( à System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage 消息(
在 [0] 处重新引发异常:à System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg( à System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type( à IWS_MG。继续操作(字符串 xmlIn( à WS_MGClient.ProceedOperation(String xmlIn(}
此异常意味着最大大小为 65536,并且接收的数据大小更大。
有人知道如何改变最大尺寸吗?
有关信息,这是我的代码:
try
{
// Factory Creation with WCF WSDL address
DynamicProxyFactory factory = new DynamicProxyFactory(sServiceWsdl);
// Solution test which doesn't work
foreach (ServiceEndpoint endpoint in factory.Endpoints)
{
Binding binding = endpoint.Binding;
XmlDictionaryReaderQuotas myReaderQuotas = new XmlDictionaryReaderQuotas();
myReaderQuotas.MaxStringContentLength = int.MaxValue;
myReaderQuotas.MaxArrayLength = int.MaxValue;
myReaderQuotas.MaxBytesPerRead = int.MaxValue;
myReaderQuotas.MaxDepth = int.MaxValue;
myReaderQuotas.MaxNameTableCharCount = int.MaxValue;
binding.GetType().GetProperty("ReaderQuotas").SetValue(binding, myReaderQuotas, null);
}
// Proxy Creation with Contract's name
DynamicProxy proxy = factory.CreateProxy(sContract);
XElement XmlIN = XElement.Parse(sXmlIN);
// Method call with parameters
XElement XmlOUT = XElement.Parse((string)proxy.CallMethod(sMethod, XmlIN.ToString()));
sXmlOUT = XmlOUT.ToString(SaveOptions.None);
proxy.Close();
}
catch (Exception e)
{
sXmlOUT = new XElement("ALL_XML_OUT", new XElement("APP_TRX", sAppTrx), new XElement("WS_RC", 1), new XElement("ERROR_MESS", e.Message)).ToString(SaveOptions.None);
}
熟悉DynamicProxy库,但绑定对象应该有一个MaxReceivedMessageSize属性,就像basicHttpBinding一样。您需要将其设置为适合您的应用程序的大于 64K 的值。此外,请确保为客户端调用的绑定配置了相同的服务值。