十五天精通WCF——终结篇 那些你需要注意的坑

简介:

终于一路走来,到了本系列的最后一篇了,这一篇也没什么好说的,整体知识框架已经在前面的系列文章中讲完了,wcf的配置众多,如果

不加一些指定配置,你可能会遇到一些灾难性的后果,快来一睹为快吧。

一: 第一个大坑 【数据传输量】

   我们使用wcf的目的,就是用来进行分布式的数据交互,既然是交互,就一定要进行数据交换,可能一些新人并没有注意到wcf在数据传输量上

面做了一个大小限制,比如我现在要传输一个2m的txt给service,会出现什么情况???


static void Main(string[] args)
 {
 try
 {
 var txt = File.ReadAllText("E:\\1.txt");

 HomeServiceClient client = new HomeServiceClient();

 client.Get(txt);

 int i = 10;

 }
 catch (Exception ex)
 {

 throw;
 }
 }

可是的可是,我们在玩aspnet的时候,再大的传输量都见过,但为什么这玩意就抛异常了呢???下面一个问题就来了,这个传输默认值到底

是多少??? 接下来我们就用ILSpy翻翻看。

可以看到,这个叼毛玩意居然只有 64k。。。没错,你看到的就是64k,也就说明你的传输量不能大于64k,否则请求就会在client端拒绝,

知道了原因,我们现在就可以这么修改config了。

 <bindings>
 <netTcpBinding>
 <binding name="MySessionBinding" maxReceivedMessageSize="2147483647"/>
 </netTcpBinding>
 </bindings>

有很多资料在配置这个坑的时候,也会使用MaxBufferSize 和 MaxBufferPoolSize,就是用来增加缓冲区和缓冲池的大小。

一: 第二个大坑 【并发量太低】

  说起这个大坑,还得先从一段代码说起,下面是一段对服务进行2w次并发调用,然后我们看看效果。


public class Program1
 {
 static void Main(string[] args)
 {
 try
 {
 for (int i = 0; i < 200000; i++)
 {
 try
 {
 Task.Factory.StartNew((obj) =>
 {
 try
 {
 HomeServiceClient client = new HomeServiceClient();

 Console.WriteLine("第 {0} 个请求开始。。。", obj);

 client.Get("12312");

 Console.WriteLine("第 {0} 个请求结束。。。", obj);
 }
 catch (Exception ex)
 {
 Console.WriteLine(ex.Message);
 }
 }, i);
 }
 catch (Exception ex)
 {
 Console.WriteLine(ex.Message);
 }
 }

 Console.Read();
 }
 catch (Exception ex)
 {
 throw;
 }
 }
 }

从上面你可以看到,当并发数达到800左右的时候,servcie端就开始拒绝client端过来的请求了,并且之后的1min的时间里,client端

开始出现超时异常,这肯定不是我想看到的, 那有人就要说了,我的并发达到800多很正常啊,如果提高这个并发呢???其实在wcf里面

有一个叫做ServiceThrottlingElement绑定元素,它就是用来控制服务端的并发数。

这三个属性的大概意思,我想大家都看的明白,不过有点奇怪的是,这三个属性的默认值 和 ILSpy中看到的不一样。。。

也懒的研究源码了,不管怎么样,反正这三个属性值都是int类型的,所以我将他们设置为int.maxValue就好了。


<system.serviceModel>
 <behaviors >
 <serviceBehaviors >
 <behavior name="nettcpBehavior">
 <serviceMetadata httpGetEnabled="false" />
 <!--是否在错误中包含有关异常的详细信息-->
 <serviceDebug includeExceptionDetailInFaults="True" />
 <serviceThrottling maxConcurrentCalls="2147483647" maxConcurrentInstances="2147483647" maxConcurrentSessions="2147483647" />
 </behavior>
 </serviceBehaviors>
 </behaviors>

 <bindings>
 <netTcpBinding>
 <binding name="MySessionBinding" />
 </netTcpBinding>
 </bindings>

 <services>
 <service behaviorConfiguration="nettcpBehavior" name="MyService.HomeService">
 <endpoint address="net.tcp://127.0.0.1:19200/HomeService" binding="netTcpBinding"
 bindingConfiguration="MySessionBinding" contract="MyService.IHomeService" />
 <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
 <host>
 <baseAddresses>
 <add baseAddress="http://127.0.0.1:1920" />
 </baseAddresses>
 </host>
 </service>
 </services>

 </system.serviceModel>

然后我们再把程序跑起来看一看。。。

现在你可以发现并发早已突破800了,不过你要记住,如果并发数太多,容易造成系统资源耗尽,导致崩溃,这时候负载均衡就来

了,对吧,wcf需要修改的配置还有很多,正因为wcf框架庞大,很多默认配置不符合生产需求,所以大家在工作中需要注意,这个系列

就到此打住了,希望对你有帮助。


相关文章
|
Web App开发 C#
WCF-找不到终结点
开发环境:Vs2010SP1 Rel 问题:开发WCF服务端新建Wcf服务的过程中,正常的新建了svc服务,在浏览器中打开总是提示找不到终结点 解决:添加svc文件时,应该选择WCF服务,而不是WCF数据服务, 如果你选择WCF数据服务,生成的svc头命令是 在浏览器中浏览这...
959 0
|
XML 安全 网络协议
WCF入门(一)——终结点,地址,绑定(1)
运行WCF服务 这里通过自宿主方式self-host来运行wcf服务。 公开终结点Endpoint,终结点由ServiceEndpoint 类来实现。它有很多的成员。其中要用到的是所说的ABC。 Address,Binding,Contract,地址,绑定,契约。
1039 0
|
网络架构
WCF入门(二)——终结点,契约(2)
Contract 契约,用于提供消息的标准,消息交换的规则。它分四类: ·服务契约 定义操作 ·数据契约 定义数据 ·异常契约 定义异常 ·消息契约 定义消息格式 (一)服务契约 服务契约,可以用接口定义,也可以直接在类上定义。
673 0
|
XML 安全 网络协议
WCF入门(一)——终结点,地址,绑定(1)
运行WCF服务 这里通过自宿主方式self-host来运行wcf服务。 公开终结点Endpoint,终结点由ServiceEndpoint 类来实现。它有很多的成员。其中要用到的是所说的ABC。 Address,Binding,Contract,地址,绑定,契约。
800 0
|
网络架构
WCF入门(二)——终结点,契约(2)
Contract 契约,用于提供消息的标准,消息交换的规则。它分四类: ·服务契约 定义操作 ·数据契约 定义数据 ·异常契约 定义异常 ·消息契约 定义消息格式 (一)服务契约 服务契约,可以用接口定义,也可以直接在类上定义。
600 0