zoukankan      html  css  js  c++  java
  • 十五天精通WCF——终结篇 那些你需要注意的坑

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

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

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

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

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

    复制代码
     1        static void Main(string[] args)
     2         {
     3             try
     4             {
     5                 var txt = File.ReadAllText("E:\1.txt");
     6 
     7                 HomeServiceClient client = new HomeServiceClient();
     8 
     9                 client.Get(txt);
    10 
    11                 int i = 10;
    12 
    13             }
    14             catch (Exception ex)
    15             {
    16 
    17                 throw;
    18             }
    19         }
    复制代码

    可是的可是,我们在玩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框架庞大,很多默认配置不符合生产需求,所以大家在工作中需要注意,这个系列

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

  • 相关阅读:
    PHP03
    PHP02
    CentOS7安装GeoServer
    uDig配图与GeoServer添加Style
    udig下载、安装及汉化
    Intellij热部署插件JRebel
    IDEA中Lombok插件的安装与使用
    IEDA 自动生成类注释和方法注释
    Elasticsearch中text与keyword的区别
    Elastic search 7.X 去掉了type的原因
  • 原文地址:https://www.cnblogs.com/Alex80/p/9312062.html
Copyright © 2011-2022 走看看