首页 > 其他分享 >十五天精通WCF——终结篇 那些你需要注意的坑

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

时间:2023-04-18 12:34:33浏览次数:39  
标签:精通 Console wcf 十五天 try 并发 client ex WCF

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

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

 

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

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

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

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

 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         }

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

 

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

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

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

 

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

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

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

 

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

十五天精通WCF——终结篇   那些你需要注意的坑_数据传输_04

 

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

  说起这个大坑,还得先从一段代码说起,下面是一段对服务进行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;
            }
        }
    }

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

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

 

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

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

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

十五天精通WCF——终结篇   那些你需要注意的坑_数据传输_07

 

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

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

 

也懒的研究源码了,不管怎么样,反正这三个属性值都是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>

 

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

十五天精通WCF——终结篇   那些你需要注意的坑_数据交换_09

 

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

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

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

 

标签:精通,Console,wcf,十五天,try,并发,client,ex,WCF
From: https://blog.51cto.com/u_15353947/6202816

相关文章

  • ASP.NET Core MVC 从入门到精通之布局
    随着技术的发展,ASP.NETCoreMVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NETCoreMVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生,或其他想从事ASP.NETCoreMVC系统开发的人员。 经过前几篇文章的讲解,初步了解ASP.NETCor......
  • [建模技术]精通它,才能毁灭它!——谈Uml与科学和工程的关系。
    在3月23日,Ivar做客,与您畅谈程序员“而立”后的成长之路,立刻参与,就有机会当面与大师交流!的帖子中,有一位朋友对UML和Ivar大加不满,于是发了一连串的回复。我今天给出了一点我的评论和看法,大家可以到上面的帖子中查看,也可以看下面的内容,下面是我转贴过来的内容:没有人在搞UML,中国只有搞......
  • 2.4 Go语言从入门到精通:条件和循环
    在程序中必然少不了条件语句和循环语句,Go语言在条件、循环语句方面与其他语言存在一定的差异,本文将针对Go语言中条件语句、循环语句的使用,这将会奠定后续复杂程序的基础。1、条件语句条件语句需要开发者通过指定一个或多个条件,并通过测试条件是否为true来决定是否执行指定语句,......
  • 2.3 Go语言从入门到精通:数据类型
    文章目录1、基本数据类型1.1布尔型1.2数值型1.2.1整型1.2.2浮点型1.2.3复数1.3字符串型2、派生数据类型2.1指针2.2数组2.3结构体2.4通道(channel)2.5切片(slice)2.6函数2.7接口(interface)2.8Map3、其他3.1数据类型转换3.2类型别名4、小结Go语言是一种静态类型的......
  • 3.3 Go语言从入门到精通:包管理工具之Govendor
    Govendor是Go的另一个依赖包管理工具,它的出现可以避免不同用户在clone同一个工程后从外部获取不同依赖库版本的问题,很好的弥补了GOPATH包管理的缺陷。govendor会将工程需要的依赖包添加到工程的vendor目录下,并且该目录中vendor.json文件会保存添加的依赖包的路径等信息......
  • 3.1 Go语言从入门到精通:包
    Go语言像Java语言一样都拥有包的概念,通过使用包来组织源代码。包(package)是多个Go源码的集合,是一种高级的代码复用方案。Go语言中为我们提供了很多内置包,如fmt、os、io等。任何Go源代码文件都必属于某个包,同时源码文件的第一行有效代码必须是packagepacakgeName语句,通过......
  • 3.2 Go语言从入门到精通:包管理工具之GOPATH
    当我们真正用Go去做项目,或者阅读Go项目(如,Go实现的开源项目)时,不可避免的会遇到包依赖问题,一些包管理方式总是很难区分、选择。Go的包管理与Java的Maven依赖管理不太一样,起初Go的包管理方式经常会被人吐槽,但随之Go版本的升级也出现了不同的包管理方式,以满足不同的需求。今天,我们......
  • ASP.NET Core MVC 从入门到精通之路由
    随着技术的发展,ASP.NETCoreMVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NETCoreMVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生,或其他想从事ASP.NETCoreMVC系统开发的人员。 经过前几篇文章的讲解,初步了解ASP.NETCor......
  • kettle从入门到精通 第十二课 kettle java代码过滤记录、利用Janino计算Java表达式
    1、下图通过简单的示例讲解了根据java代码过滤记录和利用Janino计算Java表达式两个组件。   2、根据java代码过滤记录1)步骤名称:自定义2)接收匹配的行的步骤(可选):下面条件(java表达式)执行结果为true时流转的步骤3)接收不匹配的行的步骤(可选):下面条件(java表达式)执行结果......
  • 精通 Pandas 探索性分析:1~4 全
    原文:MasteringExploratoryAnalysiswithPandas协议:CCBY-NC-SA4.0译者:飞龙一、处理不同种类的数据集在本章中,我们将学习如何在Pandas中使用不同种类的数据集格式。我们将学习如何使用Pandas导入的CSV文件提供的高级选项。我们还将研究如何在Pandas中使用Exce......