WCF - MaxStringContentLength & MaxReceivedMessageSize

[ServiceContract]
public  interface IService
{
[OperationContract]
void Test( string s);
}
public  class Service : IService 
{
public  void Test( string s)
{
Console.WriteLine(s.Length);
}
}
public  class WcfTest
{
public  static  void Test()
{
AppDomain.CreateDomain( " Server ").DoCallBack( delegate
{
ServiceHost host =  new ServiceHost( typeof(Service),  new Uri( " net.tcp://localhost:8080/service "));
host.AddServiceEndpoint( typeof(IService),  new NetTcpBinding(),  "");
host.Open();
});
IService channel = ChannelFactory<IService>.CreateChannel( new NetTcpBinding(), 
new EndpointAddress( " net.tcp://localhost:8080/Service "));

using (channel  as IDisposable)
{
channel.Test( new String( ' a ',  1024 *  10));
}
}
}

 

 

 

 运行一下,目标出现~~~ 

  未处理 System.ServiceModel.FaultException

 Message="The formatter threw an exception while trying to deserialize the message: Error in deserializing body of request message for operation 'Test'. The maximum string content length quota (8192) has been exceeded while reading <href="http://tech.ddvip.com/web/xml/index.html" target="_blank">XML</a> data. This quota may be increased by changing the MaxStringContentLength property on the XmlDictionaryReaderQuotas object used when creating the XML reader."

既然已经有了详细提示,那么我们就按照提示做。 

 

 AppDomain.CreateDomain("Server").DoCallBack(delegate

{
  XmlDictionaryReaderQuotas quotas =  new XmlDictionaryReaderQuotas();
  quotas.MaxStringContentLength =  6553500;
  NetTcpBinding binding =  new NetTcpBinding();
  binding.ReaderQuotas = quotas;
  ServiceHost host =  new ServiceHost( typeof(Service),  new Uri( " net.tcp://localhost:8080/service "));
  host.AddServiceEndpoint( typeof(IService), binding,  "");
  host.Open();
});
IService channel = ChannelFactory<IService>.CreateChannel( new NetTcpBinding(), 
   new EndpointAddress( " net.tcp://localhost:8080/Service "));
  
using (channel  as IDisposable)
{
  channel.Test( new String( ' a ',  1024 *  10));
}

 

 OK!可以运行了。我们继续加大传递的字符串。 

 IService channel = ChannelFactory<IService>.CreateChannel(new NetTcpBinding(), 

   new  EndpointAddress( "net.tcp://localhost:8080/Service" ));
  
using  (channel  as  IDisposable)
{
  channel.Test( new  String( 'a' , 1024 * 100));
}

 

 哎~~ 新的异常出现了。 

  未处理 System.ServiceModel.CommunicationException

  Message="The maximum message size quota for incoming messages has been exceeded for the remote channel. See the server logs for more details."

  看异常提示,这回要改的是 channel 的信息。

  

AppDomain.CreateDomain( " Server " ).DoCallBack( delegate 

{
  XmlDictionaryReaderQuotas quotas = new XmlDictionaryReaderQuotas();
  quotas.MaxStringContentLength = 6553500;
  NetTcpBinding binding = new NetTcpBinding();
  binding.ReaderQuotas = quotas;
  binding.MaxReceivedMessageSize = 6553500; // <---- Here!--------------
  ServiceHost host = new ServiceHost(typeof(Service), new Uri("net.tcp://localhost:8080/service"));
  host.AddServiceEndpoint(typeof(IService), binding, "");
  host.Open();
});
IService channel = ChannelFactory<IService>.CreateChannel(new NetTcpBinding(), 
  new EndpointAddress("net.tcp://localhost:8080/Service"));
  
using (channel as IDisposable)
{
  channel.Test(new String('a', 1024 * 100));
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值