• [转]十五天精通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框架庞大,很多默认配置不符合生产需求,所以大家在工作中需要注意,这个系列

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

  • 相关阅读:
    Why Choose Jetty?
    Jetty 的工作原理以及与 Tomcat 的比较
    Tomcat设计模式
    Servlet 工作原理解析
    Tomcat 系统架构
    spring boot 打包方式 spring boot 整合mybaits REST services
    wireshark udp 序列号 User Datagram Protocol UDP
    Maven 的聚合(多模块)和 Parent 继承
    缓存策略 半自动化就是mybaitis只支持数据库查出的数据映射到pojo类上,而实体到数据库的映射需要自己编写sql语句实现,相较于hibernate这种完全自动化的框架我更喜欢mybatis
    Mybatis解决sql中like通配符模糊匹配 构造方法覆盖 mybits 增删改
  • 原文地址:https://www.cnblogs.com/go-jzg/p/6281908.html
Copyright © 2020-2023  润新知