
暂无个人介绍
一、课程介绍和实例在线演示 明人不说暗话,跟着阿笨一起玩WinForm。本次分享课程属于《C#高级编程实战技能开发宝典课程系列》中的一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集、整理和完善此系列课程! 本次分享课程给大家带来一个WinForm基于开发实现多项配置存储的实战技能课程,希望对的没有接触过C/S架构开发的童鞋有一定的了解和认识吧,如果您对本次分享课程感兴趣的话,那么请跟着一起学习吧! 1.1、今天我们要学习的课程内容以及知识点? 一般的应用程序都会有基础设置功能模块,有时候当我们的基础设置数据项比较多的情况时候,你是否还在为重复和繁琐的数据项保存功能开发工作而感到烦恼?我们能否有一种优雅的通用处理框架来解决呢?答案是肯定的!阿笨根据自己的实际工作经验出发,站在第一线开发者的角度,因此总结并分享给大家一种解决方案———WinForm通过插件开发机制实现动态加载UI界面,采用面向对象中的三大特性(封装,继承,多态)来实现多项数据配置存储。 1.2、一句话总结今天我们要解决的问题? WinForm如何通过优雅的方式实现应用程序多项数据配置存储。 废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。 二、在线实例源码解读和演示 系统设置 打开系统设置界面 系统设置主界面 三、课后思考与总结 通过学习完本次分享课程想必大家也和阿笨一起感觉到OOP面向对象编程的思想的重要性 。我们实际工作中处理相同的一个问题,如果我们在开发之前就遵循面向对象的设计原则,那么设计出来的东西一定是高聚集低耦合,可扩展性强。希望大家以后编程的思想慢慢的由“面向过程” 到“面向对象”转变。 最后还是送大家一句话:师父领进门修行在个人,希望大家在学习的道路上一直坚持下去! 作者:阿笨 官方QQ一群(已满):422315558 官方QQ二群(加入):574187616 个人讲师课堂主页:https://study.163.com/provider/2544628/index.htm?share=2&shareId=2544628 个人微信公众号课程主页:http://dwz.cn/ABenNET
一、背景描述与课程介绍 明人不说暗话,跟着阿笨一起玩WinForm。本次分享课程属于《C#高级编程实战技能开发宝典课程系列》中的一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集、整理和完善此系列课程! 本次分享课程给大家带来一个基于WinForm桌面应用程序开发的HTTP网络检查工具,希望对的没有接触过C/S架构开发的童鞋有一定的了解和认识吧。 1.1、本次分享课程包含知识点如下: 1)、C#多线程(Thread)的开始、暂停基本使用操作。 2)、如何优雅的实现Winform实现跨线程安全访问UI控件。 3)、C# JSON序列化和反序列化基本使用操作。 4)、C# 如何校验自定义的JSON数据格式的合法性。 5)、C# HttpWebRequest网络请求对象的基本使用操作。 6)、C# 自定义JSON配置文件的读取和写入基本使用操作。 7)、WinForm如何将exe文件打包成一个漂亮的安装程序包。(阿笨1分钟带你学会WinForm应用程序打包制作) 8)、C# WinForm中的一些小技巧和小技能操作。(课程示例源代码提供大家下载学习) 本次分享课程阿笨给大家带来的是《WinForm多线程实现HTTP网络检测工具》,如果您对本次分享课程感兴趣的话,那么请跟着一起学习吧! 废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。 二、在线实例源码解读和演示 三、课后思考与总结 通过上面的示例我们大家应该都发现了,网络检查Job任务是一个单线程执行的,如果在任务数不多的情况下执行效率还可以接受,一旦任务数比较多,那么如何通过C#多线程技术来实现我们的多任务同时并行操作呢,从而提高应用程序的执行效率呢? 如果大家对学完本次分享课程后还感兴趣的话,那么阿笨推荐大家学习一下《C#线程池技术(TheadPool)实战项目演练》课程,在该课程阿笨将给大家分享三种线程池处理多任务技术(ThreadPool、SmartTreadPool、Task)的实战项目演练。 最后还是送大家一句话:师父领进门修行在个人,希望大家在学习的道路上一直坚持下去! 作者:阿笨 官方QQ一群(已满):422315558 官方QQ二群(加入):574187616 个人讲师课堂主页:https://study.163.com/provider/2544628/index.htm?share=2&shareId=2544628 个人微信公众号课程主页:http://dwz.cn/ABenNET
一、课程介绍 在以前,我们做日志收集大多使用 Log4net,Nlog 等框架,在应用程序变得复杂并且集群的时候,可能传统的方式已经不是很好的适用了,因为收集各个日志并且分析他们将变得麻烦而且浪费时间。相信大家的项目中日志功能已经做为基础设施里必不可少的一部分了,日志记录不仅可以更好的记录用户行为,还可以记录系统运行日志,从而看到判断系统运行的健壮性。了解决实时日志监控问题,ELK提供的一套的解决方案就应运而生了 ,作为NET技术的我们,开源的轻量级分布式ExceptionLess 日志框架或许成为了现在一种新选择!本次分享课程阿笨给大家带来的是《.NET开源分布式日志框架ExceptionLess实战演练》,如果您对本次分享课程感兴趣的话,那么请跟着一起学习吧! 废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。 二、概念名称含义和介绍 2.1、Exceptionless是什么? 2.2、Eleasticsearch是什么? 三、实战演练在线演示和解读 3.1、手把手教会你在IIS搭建本地部署ExceptionLess环境 2)、安装步骤描述: 3.2、在控制台应用程序中如何将日志推送到Exceptionless ABenNet.Exceptionless.ConsApp 3.3、在WinForm应用程序中如何将日志推送到Exceptionless ABenNet.Exceptionless.WinApp 3.4、在ASP.NET WebForm应用程序中如何将日志推送到Exceptionless ABenNet.Exceptionless.WebFormApp 3.5、在ASP.NET MVC应用程序中如何将日志推送到Exceptionless ABenNet.Exceptionless.MVCApp 3.6、在ASP.NET WebAPI应用程序中如何将日志推送到Exceptionless ABenNet.Exceptionless.WebAPIApp 3.7、在ASP.NET Xamarin For Android应用程序中如何将日志推送到Exceptionless 3.8、如何通过Log4NET将日志推送到Exceptionless ABenNet.Exceptionless.Log4NET 3.9、如何通过Nlog将日志推送到Exceptionless ABenNet.Exceptionless.NLog 3.10、聊一聊基于Exceptionless日志框架分布式架构的那点事 1)、两层日志框架架构设计 2)、三层日志框架分布式架构设计 四、总结 日志对大型应用系统或者平台尤其重要,系统日志采集、分析是系统运维、维护及用户分析的基础。 一、系统日志分类 二、常见日志分析应用场景 作者:阿笨 官方QQ一群(已满):422315558 官方QQ二群(加入):574187616 个人讲师课堂主页:https://study.163.com/provider/2544628/index.htm?share=2&shareId=2544628 个人微信公众号课程主页:http://dwz.cn/ABenNET
一、背景描述与课程介绍 明人不说暗话,跟着阿笨一起玩WebApi。在我们平时开发项目中可能会出现下面这些情况; 1)、由于用户误操作,多次点击网页表单提交按钮。由于网速等原因造成页面卡顿,用户重复刷新提交页面。黑客或恶意用户使用postman等工具重复恶意提交表单(攻击网站)。这些情况都会导致表单重复提交,造成数据重复,增加服务器负载,严重甚至会造成服务器宕机。因此有效防止表单重复提交有一定的必要性。 2)、在网速不够快的情况下,客户端发送一个请求后不能立即得到响应出现超时,由于不能确定是否请求是否被成功提交,所以它有可能会再次发送另一个相同的请求,从而造成数据重复 。 1.1、重复请求按照发起者使用的类型分为两大类 1)、Web表单POST重复请求。(发起者指的是网页浏览器端) 2)、HTTP WebApi接口重复请求。(发起者指的是客户端应用程序端) 1.2、本次分享课程包含知识点如下: 1)、对ASP.NET WebApi 有一定的了解和学习。 2)、对.NET中如何操作Redis数据库有一定的掌握和认识。 3)、.NET开源轻量级HTTP网络请求框架RestSharp在ASP.NET WebApi中的基本运用。 4)、ASP.NET WebApi服务如何实现我们的接口HTTP幂等性操作。 1.3、一句话总结今天我们要解决的问题? ASP.NET WebApi服务接口如何防止重复请求,保证HTTP幂等性操作。 本次分享课程阿笨给大家带来的是《ASP.NET WebApi服务接口如何防止重复请求》,如果您对本次分享课程感兴趣的话,那么请跟着一起学习吧! 废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。 二、概念名称含义和介绍 2.1、什么是重复提交? 2.2、什么是HTTP幂等性? 三、WebApi如何防止重复提交实现原理讲解 3.1、 如何防止Web表单POST重复请求 3.2、如何防止WebApi接口重复请求 ●基于Redis的API接口HTTP幂等性设计(推荐解决手段) 两种实现方式 客户端 Redis数据库 四、总结 作者:阿笨 官方QQ一群(已满):422315558 官方QQ二群(加入):574187616 个人讲师课堂主页:https://study.163.com/provider/2544628/index.htm?share=2&shareId=2544628 个人微信公众号课程主页:http://dwz.cn/ABenNET
一、前言 明人不说暗话,跟着阿笨一起玩WebApi!开发提供数据的WebApi服务,最重要的是数据的安全性。那么对于我们来说,如何确保数据的安全将会是需要思考的问题。在ASP.NET WebService服务中可以通过SoapHead验证机制来实现,那么在ASP.NET WebApi中我们应该如何保证我们的接口安全呢?在上此分享课程中阿笨给大家带来了传统的基于Session方式的Token签名验证,那么本次分享课程阿笨给大家带来另外一种基于JWT方式解决方案。如果您对本次分享课程《ASP.NET WebApi 基于JWT实现Token签名认证》感兴趣的话,那么请跟着阿笨一起学习吧。 1.1、本次分享课程包含知识点如下: 1)、对ASP.NET WebApi 如何实现身份认证进一步了解和学习。 2)、掌握.NET中的JWT组件的基本运用。 3)、.NET开源轻量级HTTP网络请求框架RestSharp在ASP.NET WebApi中的基本运用。 4)、ASP.NET WebAPI自定义HTTP参数绑定支持多参数POST请求。(强烈推荐) 5)、ASP.NET WebApi 基于JWT(Json Web Token)实现Token签名认证。 1.2、一句话总结:今天我们要解决的问题? ASP.NET WebAPI如何保证客户端以安全的方式进行访问。 废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运 二、概念名称含义介绍 2.1、什么是JWT? 2.2、JWT长什么样? 2.3、JWT的构成 三、WebApi如何实现JWT实现Token签名认证原理讲解 3.1、ASP.NET WebAPI如何保证客户端以安全的方式进行访问 3.2、基于JWT实现Token签名认证基本思路如下: 四、实战源码在线实例演示 登录 基于JWT实现Token签名认证 JWT在线验证 作者:阿笨 官方QQ一群(已满):422315558 官方QQ二群(加入):574187616 个人讲师课堂主页:http://study.163.com/instructor/2544628.htm?share=2&shareId=2544628 个人微信公众号课程主页:http://dwz.cn/ABenNET
一、课程介绍 明人不说暗话,跟着阿笨一起学玩WebApi!开发提供数据的WebApi服务,最重要的是数据的安全性。那么对于我们来说,如何确保数据的安全将会是需要思考的问题。在ASP.NETWebService服务中可以通过SoapHead验证机制来实现,那么在ASP.NET WebApi中我们应该如何保证我们的接口安全呢?如果您对本次分享课程《ASP.NET WebApi 基于分布式Session方式实现Token签名认证》感兴趣的话,那么请跟踪阿笨一起学习吧。 1.1、本次分享课程包含知识点如下: 1)、对ASP.NET WebApi 如何实现身份认证进一步了解和学习。 2)、ASP.NET 如何实现将自定义Session存储在Redis中。 3)、.NET开源轻量级HTTP网络请求框架RestSharp在ASP.NET WebApi中的基本运用。 4)、ASP.NET WebAPI自定义HTTP参数绑定支持多参数POST请求。(强烈推荐) 5)、ASP.NET WebApi如何基于分布式Session方式实现Token认证。 1.2、一句话总结:今天我们要解决的问题? ASP.NET WebAPI如何保证客户端以安全的方式进行访问。 废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。 二、概念名称含义解释 2.1、什么是授权 (authorization) ? 2.2、什么是认证 (authentication) ? 2.3、认证 (authentication) 和授权 (authorization) 的区别 三、WebApi如何实现Token认证实现原理讲解 3.1、ASP.NET WebAPI如何保证客户端以安全的方式进行访问 3.2、基于分布式Session方式实现Token认证基本思路如下: 基本流程上是这样的: ●用户使用用户名密码来请求服务器。 ●服务器进行验证用户的信息。 ●服务器通过验证发送给用户一个token。 ●客户端存储token,并在每次请求时附送上这个token值。 ●服务端验证token值,并返回数据。 Session实现Token签名认证原理图 四、实战源码在线实例演示 登陆 基于Session实现Token签名认证 分布式Session 五、总结 作者:阿笨 官方QQ一群(已满):422315558 官方QQ二群(加入):574187616 个人讲师课堂主页:http://study.163.com/instructor/2544628.htm?share=2&shareId=2544628 个人微信公众号课程主页:http://dwz.cn/ABenNET
由于之前使用的是默认配置,服务器最多只能处理5000个同时请求,今天下午由于某种情况造成同时请求超过5000,从而出现了上面的错误。 为了避免这样的错误,我们根据相关文档调整了设置,让服务器从设置上支持10万个并发请求。 具体设置如下: 1. 调整IIS 7应用程序池队列长度 由原来的默认1000改为65535。 IIS Manager > ApplicationPools > Advanced Settings Queue Length : 65535 2. 调整IIS 7的appConcurrentRequestLimit设置 由原来的默认5000改为100000。 c:\windows\system32\inetsrv\appcmd.exe set config /section:serverRuntime /appConcurrentRequestLimit:100000 在%systemroot%\System32\inetsrv\config\applicationHost.config中可以查看到该设置: <serverRuntime appConcurrentRequestLimit="100000" /> 3. 调整machine.config中的processModel>requestQueueLimit的设置 由原来的默认5000改为100000。 <configuration> <system.web> <processModel enable="true" requestQueueLimit="100000"/> 参考文章:http://technet.microsoft.com/en-us/library/dd425294(office.13).aspx 4. 修改注册表,调整IIS 7支持的同时TCPIP连接数 由原来的默认5000改为100000。 reg add HKLM\System\CurrentControlSet\Services\HTTP\Parameters /v MaxConnections /t REG_DWORD /d 100000 5. 运行命令使用设置生效 net stop http & net start http & iisreset 完成上述4个设置,就可以支持10万个并发请求,博客园博客服务器已经启用上述设置。 彪悍的人生不需要解释,彪悍的代码不需要注释。 作者:阿笨 官方QQ一群(已满):422315558 官方QQ二群(加入):574187616 个人讲师课堂主页:http://study.163.com/instructor/2544628.htm?share=2&shareId=2544628 个人微信公众号课程主页:http://dwz.cn/ABenNET
一、需求背景介绍 1.1、需求描述 大家都知道C/S架构模式的客户端应用程序(比如:WinForm桌面应用、WPF、移动App应用程序、控制台应用程序、Windows服务等等)的日志记录都存储在本地客户端中,这样就导致有时候一旦客户端出现了的异常问题,为了快速地定位对应服务端出现的位置却极其的繁琐和不方便,就需要找到当时的客户端出现异常问题的日志快照记录。 所以说为了解决实时日志监控问题,ELK提供的一套的解决方案就应运而生了 。然而真实的现状往往比你现实的想象中的还有更糟糕,很有可能在我们的项目团队中会遇到一些下面的问题: 1)、 我们公司都是Windows服务器,没有专门 Linux 运维人员! 2)、. NET项目技术成员目前对Windows系统比较熟悉,对Linux系统不太熟悉。 3)、考虑时间成本短时间内不可能开发出来一套成熟的实时日志监控系统。 那么作为.NET技术的我们该如何快速的搭建中小型企业级日志实时监控系统,解决我们的日志实时监控痛点问题! 一位伟大的领袖说过这么一句话:自己动手,丰衣足食!那么新时代的赋予了我们年轻人的使命:撸起袖子加油干! 1.2、一句话总结今天我们要解决的问题是什么? 作为.NET技术的我们如何在Windows平台上快速的搭建中小型企业级日志实时监控系统! ps:日志主要包括系统日志、应用程序日志和安全日志。本课程所说的“日志”,如果没有特别说明,即默认指的是应用程序日志! 废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。 二、概念名称含义和解释 2.1、ELK介绍 2.2、ELK原理 2.3、为什么使用 ELK ? 三、实战项目在线演练和解读 3.1、在Windows上安装Elasticsearch和kibana 3.2、在Windows上安装Elasticsearch—Head插件。 3.3、在Windows上搭建Elasticsearch集群 3.4、如何将应用程序日志通过log4net推送到Eleasticsearch 3.5、如何将应用程序日志通过Nlog推送到Eleasticsearch 3.5、如何将应用程序日志通过NEST SKD推送到Eleasticsearch 3.6、聊一聊基于Eleasticsearch日志系统分布式架构的那点事 1)、两层日志平台架构设计 2)、三层日志平台架构设计 3)、WebApi服务应用程序如何接入实时日志监控平台系统。 四、总结 传统&新型的日志架构特点对比 3、结束语 五、源码在线解读和演示 作者:阿笨 官方QQ一群(已满):422315558 官方QQ二群(加入):574187616 个人讲师课堂主页:http://study.163.com/instructor/2544628.htm?share=2&shareId=2544628 个人微信公众号课程主页:http://dwz.cn/ABenNET
错误提示: Severity Code Description Project File Line Suppression StateError This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is ..\packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.props. Luck100 C:\Goods.csproj 315 解决办法:参考:http://docs.nuget.org/ndocs/consume-packages/package-restore找到 项目文件.csproj,打开后,移除下面的内容 <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> <PropertyGroup> <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText> </PropertyGroup> <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" /> </Target> 作者:阿笨 官方QQ一群(已满):422315558 官方QQ二群(加入):574187616 个人讲师课堂主页:http://study.163.com/instructor/2544628.htm?share=2&shareId=2544628 个人微信公众号课程主页:http://dwz.cn/ABenNET
错误提示: Severity Code Description Project File Line Suppression StateError This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is ..\packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.props. Luck100 C:\Goods.csproj 315 解决办法:参考:http://docs.nuget.org/ndocs/consume-packages/package-restore找到 项目文件.csproj,打开后,移除下面的内容 <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> <PropertyGroup> <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText> </PropertyGroup> <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" /> </Target> 作者:阿笨 官方QQ一群(已满):422315558 官方QQ二群(加入):574187616 个人讲师课堂主页:https://study.163.com/provider/2544628/index.htm?share=2&shareId=2544628 个人微信公众号课程主页:http://dwz.cn/ABenNET
错误提示: Severity Code Description Project File Line Suppression StateError This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is ..\packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.props. Luck100 C:\Goods.csproj 315 解决办法:参考:http://docs.nuget.org/ndocs/consume-packages/package-restore找到 项目文件.csproj,打开后,移除下面的内容 <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> <PropertyGroup> <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText> </PropertyGroup> <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" /> </Target> 作者:阿笨 官方QQ一群(已满):422315558 官方QQ二群(加入):574187616 个人讲师课堂主页:https://study.163.com/provider/2544628/index.htm?share=2&shareId=2544628 个人微信公众号课程主页:http://dwz.cn/ABenNET
错误提示: Severity Code Description Project File Line Suppression StateError This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is ..\packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.props. Luck100 C:\Goods.csproj 315 解决办法:参考:http://docs.nuget.org/ndocs/consume-packages/package-restore找到 项目文件.csproj,打开后,移除下面的内容 <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> <PropertyGroup> <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText> </PropertyGroup> <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" /> </Target> 作者:阿笨 官方QQ一群(已满):422315558 官方QQ二群(加入):574187616 个人讲师课堂主页:http://study.163.com/instructor/2544628.htm?share=2&shareId=2544628 个人微信公众号课程主页:http://dwz.cn/ABenNET
错误提示: Severity Code Description Project File Line Suppression StateError This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is ..\packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.props. Luck100 C:\Goods.csproj 315 解决办法:参考:http://docs.nuget.org/ndocs/consume-packages/package-restore找到 项目文件.csproj,打开后,移除下面的内容 <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> <PropertyGroup> <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText> </PropertyGroup> <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" /> </Target> 作者:阿笨 官方QQ一群(已满):422315558 官方QQ二群(加入):574187616 个人讲师课堂主页:https://study.163.com/provider/2544628/index.htm?share=2&shareId=2544628 个人微信公众号课程主页:http://dwz.cn/ABenNET
一、课程介绍 本次分享课程属于《C#高级编程实战技能开发宝典课程系列》中的第六部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集、整理和完善此系列课程! 一、本高级系列课程适合人群如下 1、有一定的NET开发基础。 2、喜欢阿笨的干货分享课程的童鞋们。 二、今天我们要解决的日志痛点问题描述 1)、你是否在为找到一款轻量级日志组件四处寻找而感到烦恼? 2)、你是否在为log4net、nlog繁琐的配置文件而感到烦恼? 3)、你是否在寻找一款日志文件记录的格式内容简洁的日志组件而感到烦恼? 4)、你是否在寻找一款可以支持自定义按照功能模块分类存储日志文件的组件而感到烦恼? 如果您有遇到以上提及到的其中一点的话,那么恭喜你很幸运看到了阿笨的轻量级EasyLogger日志组件。 废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。 二、涉及覆盖的知识点 1、C#高效的线程安全队列ConcurrentQueue实战运用。 2、C# 线程的挂起与唤醒 (AutoResetEvent,ManualResetEvent)实战运用。 3、C# 采用生产者消费者队列模式将日志文件异步的落地在磁盘中。 4、C# EasyLogger实现自定义按照功能模块分类存储日志文件。(强烈推荐) 5、C# 微软单元测试UnitTest项目应用程序运用。 6、C# 性能测试器PerformanceTestor运用。 三、实战项目背景介绍 一、实战背景介绍 在我们实际项目中大家一般的开源日志组件比如:Log4net、NLog等等, 在使用的时候所有功能模块的日志记录的信息都依赖同一个配置,特别是在项目中的定时任务作业计划调度应用程序中 ,于是所有的作业日志信息都在记录在一个文件中,有时候查找起来,极其不方便。 那么我们能不能按照功能分类记录日志文件呢?虽然Log4net、NLog 可以通过 配置不同的logger,然后功能根据不同的LoggerName加载Ilog实例,是可以做到;但是实现起来繁琐和复杂。所以我们必须自己来造这个新轮子来满足适合工作中的实际项目需求。 二、EasyLogger特点介绍 1、简单、容易上手,只需要引入一个DLL文件即可;无需繁琐的配置文件。 2、支持多线程大并发同时写入。 3、支持自定义按照功能模块分类存储日志文件。(强烈推荐) 4、支持将日志文件存储在Elasticsearch全文搜索引擎中。(后续计划中) 四、EasyLogger实现原理 一、核心实现原理讲解 我们将使用列队将日志信息先缓存到内存,然后我们一直有个线程再从列队中写到磁盘上,这样就可以高速高性能的写日志了。 二、为什么说是超高性能日志组件? EasyLogger内部采用典型的生产者消费模式。我们就把速度慢的地方分离出来了,也就是说程序在把日志扔给列队后,程序的日志部分就算完成了,后面操作磁盘耗时的部分程序是不需要关心的,由另一个线程操作将日志文件写在硬盘中。 实现原理图 五、源码在线解读和演示 项目截图 作者:阿笨 官方QQ一群(已满):422315558 官方QQ二群(加入):574187616 个人讲师课堂主页:http://study.163.com/instructor/2544628.htm?share=2&shareId=2544628 个人微信公众号课程主页:http://dwz.cn/ABenNET
一、课程介绍 在前面阿笨的《C# Xamarin移动开发基础进修篇》课程中,大家已经熟悉和了解了Xamarin移动App开发的基础知识和原理。本次分享课《C# Xamarin移动开发项目实战篇》,阿笨将直接带领大家进入Xamarin for android的实战项目环节,真真体验一下xamarin开发的魅力吧。 由于阿笨学习Xamarin也是“半路出家”,“赶鸭子上架”的状态,视频教学中关于Xamarin for Android的知识点难免有不足和不完善的地方,希望大家能够多多交流和互相学习。阿笨保证的一点是把自己知道的知识尽量的毫无保留全部都给大家进行分享。 本次分享课程适合人群如下: 1、 热爱Xamarin跨平台移动开发。 2、进一步了解和学习Xamarin For Android移动开发实战知识。 本次分享课包含实战分享知识点如下: 1、Android 线程实际场景运用(UI Thread) 2、Android播放Assets目录下的音乐 3、Xam.Plugins.Settings插件存储应用程序配置信息。 4、Android漂亮的导航菜单栏控件(Navigation Bar) 5、Android漂亮的下拉列表控件(ComboBox Bar) 6、Android漂亮的Loading提示控件(ProgressDialog) 7、Android漂亮的主菜单界面(GridView) 8、Android漂亮的列表展示数据(ListView) 9、 C# Xamarin App之打包APK文件和自动升级 10、思考与探讨移动架构设计 1)、C#如何设计我们的Android移动项目框架。 2)、Android如何友好的记录HTTP服务接口请求日志。 本次分享课程最终目标: 希望学完本次分享课程后能够快速通过Xamarin For Android打造一个后台管理系统App应用程序,从而将学习成果转化为工作成果。 废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。 二、Xamarin For Android项目实战示例演示 项目实战示例演示 三、C# Xamarin移动开发项目实战分享 3.1、Android 线程实际场景运用( UI Thread) 主线程也叫UI线程 当一个程序启动的时候,系统自动创建一个主线程,在这个主线程中,你的应用(app、winform等客户端程序)和UI组件发生交互,负责处理UI组件的各种事件,所以主线程也叫UI线程。 UI组件的更新一定要在UI线程里 android为了线程安全,不允许在UI线程外的子线程操作UI,这个结论不仅仅是说android,这个概念同样适用于其他的客户端系统,它的好处时提高客户端UI的用户体验和执行。 3.2、Android播放Assets目录下的音乐 Android assets的作用: 1: 可以用来实现html5+javascript+android的混合开发中,一般html5和javascript以及相关资源可以存放在Assets文件夹内。 2:可以放一些资源文件 3.3、Xam.Plugins.Settings插件存储应用程序配置信息。 在Nuget命令行中输入如下的命令即可。 Install-Package Xam.Plugins.Settings 主要是CrossSettings.Current对象和它的2个函数GetValueOrDefault、AddOrUpdateValue,这2个函数的功能看名字应该就非常清楚了。 // 从设置中获取指定Key的值,并转换成相应的类型。GetValueOrDefault(stringkey);// 向设置中添加制定key的值,如果已存在key则是更新当前值。AddOrUpdateValue(stringkey,Tvalue); 设置的生命周期与应用程序一样,当应用程序被卸载时清空。 3.4、Android漂亮的导航菜单栏控件(Navigation Bar) Android手机可分为有导航栏以及没导航栏两种,一般有物理按键的机器不会带有导航栏,而没有物理按键的机器则基本会带,比如华为的手机基本都是带导航栏的。因此需要自定义重写一个Navigation控件。 3.5、Android漂亮的下拉列表控件(ComboBox Bar) Spinner这个词可能有些陌生,在Java中,就是ComboBox。由于Android 系统的Spinner 控件无法满足项目的要求,所以自定义重写了一个ComboBox控件。 3.6、Android漂亮的Loading提示控件(ProgressDialog) ProgressDialog可以在当前界面弹出一个置顶于所有界面元素的对话框,同样具有屏蔽其他控件的交互能力,用于提示用户当前操作正在运行,让用户等待;以下就是ProgressDialog的使用步骤: 1.创建一个ProgressDialog的实例; 2.设置其标题; 3.设置其内容; 4.设置可否使用back键返回,这里设置若是为progressDialog.setCancelable(flase),则要在数据加载完成后调用ProgressDialog的dismiss()来关闭对话框; 5.将对话框显示出来。 3.7、Android漂亮的主菜单界面(GridView) GridView与ListView的用法基本一致,不同的只是布局。当我们打开手机,应用会以宫格显示,那就是GridView。 以代码形式展示给大家,适配器使用SimpleAdapter,熟悉了适配器的用法,就只需要注意几个GridView的属性即可。 ListView 和 GridView 是 AdapterView 的子类,它们可以绑定填充到一个适配器,从外部源检索数据,并创建一个视图表示每个数据项。 3.8、Android漂亮的列表展示数据(ListView) GridView与ListView的用法基本一致,不同的只是布局。当我们打开手机,应用会以列表显示,那就是GridView。 ListView 和 GridView 是 AdapterView 的子类,它们可以绑定填充到一个适配器,从外部源检索数据,并创建一个视图表示每个数据项。 3.9、C# Xamarin App之打包APK文件和自动升级 详细可以参考《C# Xamarin App之打包APK文件和自动升级》课程。 三、思考与探讨移动架构设计 3.1、C#如何设计我们的Android移动项目框架。 3.2、Android如何友好的记录HTTP服务接口请求日志。 四、总结 阿笨当初学习Xamarin也就花了三天的时间就开发出了视频中的App雏形。所以说大家不要认为xamarin for android 开发有多么的困难,现在微软也大力在更新xamarin,之后对我们开发者来说只有越来越方便的了。 学习Xamarin For Android移动开发,阿笨总结了两点: 1、具备一定的C#语言基础开发知识。只要你有一定的C#语言基础,那么上手Xamarin开发将毫无压力。 2、掌握一定的Android基础原理和知识。 Android界面布局(Layout)和常用的控件的使用以及Android原理知识这几点必须要有一定的掌握,可以学习从java android 方面的视频课程,因为这块的android知识都是一样的,跟开发语言并没有什么太大的关系。 俗话说的好:师父领进门修行在个人,希望大家在学习的道路上一直坚持下去! 五、在线源码观看地址 作者:阿笨 官方QQ一群(已满):422315558 官方QQ二群(加入):574187616 个人讲师课堂主页:http://study.163.com/instructor/2544628.htm?share=2&shareId=2544628 个人微信公众号课程主页:http://dwz.cn/ABenNET
一、课程介绍 “明人不说暗话,跟着阿笨一起玩Xamarin”,本次分享课程阿笨将带来大家一起学习Xamarin For Android系列《C# Xamarin For Android自动升级项目实战》。如果您同样对本次分享课程感兴趣的话,那么请跟着阿笨一起学习吧。 本次分享课程适合人群如下: 1、 热爱Xamarin跨平台移动开发。 2、进一步了解和学习Xamarin For Android移动开发实战知识。 本次分享课包含实战分享知识点如下: 1、C# Android 如何制作打包编译APK文件 2、C# Android如何实现自动升级功能(AutoUpdate) 本次分享课程最终目标:希望学完本次分享课程后能够快速通过Xamarin For Android打造一个后台管理系统App应用程序,从而将学习成果转化为工作成果。 废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。 二、涉及覆盖Android小技巧和小技能知识点 学习本次《C# Xamarin For Android自动升级项目实战》分享课程,你将掌握以下关于Xamarin For Android方面的干货知识点。 1)、拉风的窗体启动动画(SplashActivity) 2)、酷炫漂亮的登录窗体(LoginActivity)布局。 3)、漂亮的自定义导航栏控件(TitleBar) 4)、C# Android如何检测网络是否正常。 5)、UI线程(RunOnUiThread)第一次实际运用。 6)、C# Android如何播放音频文件。 7)、C# Android中封装MessageBoxHelper弹窗控件。 8)、C# Android XML序列化和反序列化。 9)、C# Android Assets目录存储我们的应用程序资源和配置文件。 三、实战演练示例分享 3.1、C# Android 如何制作打包编译APK文件 阿笨将带来大家一步步学习Xamarin For Android 打包编译APK文件。 1、首先签名是个什么东西? Android对应用程序签名就是为你的程序打上一种标记,来作为你自己的标识。 2、为什么要进行数字签名? 这是Android系统的要求,每一个应用程序必要要经过数字签名才可能安装到系统中,能安装的apk则是已经签名了的。 apk不签名是安装不了的,但是别人也可以重新签名。 使用你自己的同一个签名证书,就没有人能够覆盖你的应用程序,即使包名相同。 特别注意:通过Debug和Release生成的apk文件由于没有带签名,直接部署在真机中会出现闪退的情况。 参考文章: Xamarin 跨移动端开发系列(01) -- 搭建环境、编译、调试、部署、运行 3.2、C# Android自动升级原理剖析 Android如何实现自动升级功能(AutoUpdate) Autoupdate.exe从字面意思理解应该为一个自动升级程序。 实现步骤: 1.检测当前版本的信息AndroidManifest.xml–>manifest–>[Android] 2.从服务器获取版本号(版本号存在于xml文件中)并与当前检测到的版本进行匹配,如果不匹配,提示用户进行升级,如果匹配则进入程序主界面。(demo中假设需要更新) 3.当提示用户进行版本升级时,如果用户点击了“更新”,系统将自动从服务器上下载安装包并进行自动升级,如果点击取消将进入程序主界面。 原理图 四、在线源码解读和演示 作者:阿笨 官方QQ一群(已满):422315558 官方QQ二群(加入):574187616 个人讲师课堂主页:http://study.163.com/instructor/2544628.htm?share=2&shareId=2544628 个人微信公众号课程主页:http://dwz.cn/ABenNET
参考文章: https://www.cnblogs.com/forerunner/p/why-we-quit.html 跳还是不跳 「跳还是不跳」,依旧是一个问题。但首先,我们要珍惜且珍视我们现在的工作。不管你是否还对这份工作充满激情或保留感情,我们始终要记住一点,我们曾经也是通过面试进来的,所以首先我们要保持这份感恩的心——感谢现在的公司曾经提供给我这么一份机会,让我现在或曾经有过一段拼搏的记忆,使未来的我能多一份可贵的回忆——这便足够了。 在这里笔者不能明确指明道路,毕竟笔者也正在这条道路上行走着,笔者自己也并未超脱出去,因此笔者只能分享自己的一些看法。 我们要多学一点,傍着一门好手艺,总能找到好东家,打铁还需自身硬。如果自己的功力不够,武林大会的海选阶段你就被人干掉了,更不用说是最后的大角逐。所以我们要把握住每一分每一秒钟,多学一点本行业的专业知识,通过社区、群、邮件组、小范围聚会、博客等渠道和手段分享经验、汲取经验、交流沟通,让自己的眼光变得更高、格局变得更大,机遇自然也会变得更多、更好。 如果不是不可调停的根本性的矛盾,尽量不要与领导、团队负责人产生争执。他们在企业中的地位高于你,所以他们比你掌握更多的资源(意味着有足够多的办法给你穿小鞋,不得好受),虽然我们鄙视赤裸裸的拍马屁,但偶尔的不显山水的拍马也是需要的。你给领导一点心理上的蜜糖吃,双方心领神会,不是坏事儿。 如果工资确实不如人意,和你的直接负责人沟通(而不是越级沟通),这点很重要(笔者在这里向大家推荐《权力》和《权谋》这两本书,阅读这两本书会受益匪浅)。如果工资不能明显提高,待遇也没有明显变好的迹象(承诺变好这种事不要轻易相信,资本家的承诺比大灰狼给小红帽说的话还假),那么你可以着手跳槽的一系列准备(自身的知识准备、辞职交接的相关文件的准备、工作任务的隐式交割准备等),这一阶段最好不要让别人知道你有离职的打算,避免外部因素破坏了你的准备工作。 尽可能地带着微笑离开公司,不管你的领导是否曾经有过不太好的行为。我们离开了,所以我们是胜利者,带着微笑离开的我们,请多一点宽容心罢。 频繁跳槽,确实是一个忌讳,不少公司虽然已经对跳槽的敏感度有所下降,但过于频繁的跳槽也会给新的用人单位一种忠臣不足、不太靠谱、不够稳重的印象,这一点我们程序员要切记。跳槽需三思,要给自己留条后路,尽最大努力避免得不偿失的结局。 作者:阿笨 官方QQ一群(已满):422315558 官方QQ二群(加入):574187616 个人讲师课堂主页:http://study.163.com/instructor/2544628.htm?share=2&shareId=2544628 个人微信公众号课程主页:http://dwz.cn/ABenNET
一、课程介绍 本次分享课程属于《C#高级编程实战技能开发宝典课程系列》中的第五部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集、整理和完善此系列课程! 本次分享课程适合人群如下: 1、想学习Grid++Report报表工具在C/S项目中的实战演练。 2、喜欢阿笨的干货分享课程的童鞋们。 3、想解决我们在实际工作中运到的“复杂多变”的标签打印痛点问题。 本次分享课涉及覆盖的知识点: 1)、Grid++Report报表工具正确的安装步骤以及科学的快速学习方法分享。 2)、掌握Grid++Report报表工具使用过程中需要注意事项。 3)、掌握Grid++Report报表工具在C/S项目中的基本运用。 4)、掌握Grid++Report报表工具如何在生产环境C/S项目中的进行发布部署。 5)、基于Grid++Report报表工具开发的两个C/S项目中的实例分享 。 6)、如何灵活地采用面向对象设计解决我们项目中经常遇到复杂多变的“标签打印”需求痛点。(强烈推荐) 希望大家在选择阿笨的 C#高级编程实战技能开发宝典课程系列的时候,根据自身的情况进行选择,由于本次课程不是零基础教学课程系列,所以说.NET基础差的到了没朋友的地步话,那阿笨建议您还是先“学”好NET的一些基础知识,然后在来跟着阿笨“玩” 本次分享课来源灵感是阿笨在实际项目中经验碰到的一个真实的业务场景 , 如果您同样对本次分享《Grid++Report报表工具C/S实战篇》课程感兴趣的话,那么请跟着阿笨一起学习吧。 废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。 二、概念名称含义和解释 2.1、Grid++Report介绍 Grid++Report是一款同时支持C/S软件(桌面程序)与B/S软件(WEB程序)开发的报表工具,功能全面易学易用。C/S开发适用于VB.NET、C#、VB、VC、Delphi、C++Builder、QT与易语言等。B/S开发适用于ASP.NET(C# & VB.NET),PHP,JSP(JAVA)等,支持所有WEB服务器。开发C/S报表与B/S报表的编程接口、报表模板与报表数据通用,共享相同的开发知识与设计资源。 2.2、Grid++Report特点 适用范围广:C#.NET、VB、VC、Delphi、C++Builder、中文编程易语言等一切支持 COM 的开发工具。 详细请参考:关于Grid++Report报表工具的介绍 阿笨简单总结一下: Grid++Report工具可以解决我们工作中经常运到的“报表、打印、数据分析,数据导出”等等实用操作功能。 三、实战项目背景介绍 大家都知道C/S客户端打印条码的常用几种方式,这里阿笨给大家进行总结下,如下: 一、基于打印机指令方式打印。 1、)基于厂商提供的SDK程序集DLL编程方式。 特点:编程门槛中级;标签模板编程复杂、代码维护成本高。常用范围:也只适合一定简单固定样式的模板标签。比如POS小票样式,SKU商品条码。 2、)基于打印机特有指令编程方式(比如:斑马打印机ZPL、EPL指令)。 特点:可以通过编程方式控制打印机系统参数设置;但是最大的缺点就是可编程性太差,而且门槛极其高,学习和模板维护成本高! 常用范围:也只适合一定简单固定样式的模板标签。比如POS小票样式,SKU商品条码。 二、基于驱动方式打印。 1、)基于GDI+编程方式。 特点:学习成本一般,模板维护成功高;也只适合一些简单固定样式的标签模板。比如POS小票样式,SKU商品条码。 2)、基于可视化模板设计+编程方式。(强烈推荐) 采用第三方标签设计软件或者报表工具。比如:bartender 标签打印软件、条码标签打印设计软件CODESOFT、LabelShop 、微软RDLC报表、第三方FastReport报表工具、ActiveReport、Grid++Report等等条码和报表工具。 这里跟大家强烈推荐国产Grid++Report报表工具。大家要明白的一个概念,报表工具的范围比条码打印软件功能广,报表工具阿笨理解的是:报表模板设计器+报表显示工具,所以我们可以采用报表工具来解决我们工作中运到的各种复杂标签模板打印的需求。 四、项目实战示例在线演示和解读 一句话:今天我们要解决的一个痛点问题? 如何解决我们实际工作中遇到的各种复杂多变的标签条码打印需求,真真实现以不变应对万变。 1)、Grid++Report报表工具正确的安装步骤以及科学的快速学习方法分享。 2)、掌握Grid++Report报表工具使用过程中需要注意事项。 3)、掌握Grid++Report报表工具在C/S项目中的基本运用。 4)、掌握Grid++Report报表工具如何在生产环境C/S项目中的进行发布部署。 5)、基于Grid++Report报表工具开发的两个C/S项目中的实例分享。 6)、如何灵活地采用面向对象设计解决我们项目中经常遇到复杂多变的“标签打印”需求痛点。 五、总结 希望大家在学习一门新的语法或者技术的时候,能够与自己的实际场景项目相结合,这样才能够更好的理解和认识。阿笨当初接触到Grid++Report的时候就深深被吸引住了,这不就是我们一直要找的“可视化模板设计+编程方式”标签打印方案吗?所以就第一时间上手后用到了实际项目中去,做到学以致用!希望大家学完本次分享课程后对Grid++Report报表工具一定的基本了解和认识。俗话说的好:师父领进门修行在个人,希望大家在学习的道路上一直坚持下去! 六、源码在线观看地址 作者:阿笨 官方QQ一群(已满):422315558 官方QQ二群(加入):574187616 个人讲师课堂主页:http://study.163.com/instructor/2544628.htm?share=2&shareId=2544628 个人微信公众号课程主页:http://dwz.cn/ABenNET
一、课程介绍 本次分享课程包含两个部分《.NET轻量级ORM框架Dapper修炼手册》和《.NET轻量级ORM框架Dapper葵花宝典》,阿笨将带领大家一起领略轻量级ORM框架Dapper的魅力。 本次分享课程适合人群范围: 一、《.NET轻量级ORM框架Dapper修炼手册》适合人群如下: 1、我是一个新手,主要工作面向的是MS SQL Server数据库,那么选择修炼手册一定没错。 2、对Dapper从没有过了解或者了解不全面的同学,想通过学习进一步提升对Dapper的认识。 3、迫切想提高下ADO.NET实战技术以及Transact-SQL的编写能力。 二、《.NET轻量级ORM框架Dapper葵花宝典》适合人群如下: 1、我是一个新手,主要工作面向的是MySQL数据库,那么选择葵花宝典一定没错。 2、在Dapper修炼手册的基础上新增一个Dapper扩展库Dapper.SimpleCRUD。 3、如何运用Dapper操作Mysql数据库以及Dapper如何支持多数据库。 4、学习Dapper在实际项目常用的几种开发架构模式。(简单三层架构模式、工厂模式、Repository架构模式) 5、本次新增Dapper如何以优雅的方式使用事务。(强烈推荐) 二、课程知识点 2.1、《.NET轻量级ORM框架Dapper修炼手册》覆盖知识点 1、C# Linq To Xml技术。 2、Transact-SQL修炼手册。比如如何使用临时表、创建用户自定义表(TABLE)、XML数据字段、ROW_NUMBER分页函数、存储过程修炼手册(动态执行SQL、异常处理机制、事务处理机制)、C#如何获取存储过程的OUTPUT、RETURN参数值。 3、SQL Sever FOR XML技术(XML PATH、XML RAW、XML AUTO简单用法介绍)。 4、Transact-SQL关键字OPENXML操作内存中的 XML 文档。 5、Faker.Net仿照测试数据框架运用。 6、VS单元测试NuitTest运用。 7、Dapper在异步编程(Asyn Task)中的运用。 8、原生Dapper简单的CRUD(增删改查) 修炼手册。(强烈推荐) 9、Dapper如何通过DynamicParameters动态拼接查询SQL修炼手册。(强烈推荐) 10、Dapper扩展库Dapper.SqlBuilder、UniqueNamespace.SqlBuilder修炼手册。(强烈推荐) 11、原生Dapper高级技巧修炼手册。(强烈推荐) 12、Dapper扩展库Dapper-Extensions修炼手册。(强烈推荐) 2.2、《.NET轻量级ORM框架Dapper葵花宝典》覆盖知识点 1、.NET程序员对MySQL数据库的基本认识和理解以及使用。 2、如何通过使用.NET轻量级ORM框架Dapper操作MySQL数据库。 3、Faker.Net仿照测试数据框架运用。 4、VS单元测试NuitTest运用。 5、Dapper在异步编程(Asyn Task)中的运用。 6、原生Dapper简单的CRUD(增删改查) 葵花宝典。(强烈推荐) 7、Dapper扩展库Dapper.SimpleCRUD的基本使用。(强烈推荐) 8、Dapper如何通过DynamicParameters动态拼接查询SQL葵花宝典。(强烈推荐) 9、Dapper扩展库Dapper.SqlBuilder、UniqueNamespace.SqlBuilder葵花宝典。(强烈推荐) 10、原生Dapper高级技巧葵花宝典。(强烈推荐) 11、Dapper扩展库Dapper-Extensions葵花宝典。(强烈推荐) 三、在线源码观看地址 作者:阿笨 官方QQ一群(已满):422315558 官方QQ二群(加入):574187616 个人讲师课堂主页:http://study.163.com/instructor/2544628.htm?share=2&shareId=2544628 个人微信公众号课程主页:http://dwz.cn/ABenNET
一、课程介绍 曾经有一位不知名的讲师说过这么一句名言: 一门RPC技术不会,那么千万万门RPC技术将都不会!在今天移动互联网的时代,作为攻城师的我们,谁不想着只写一套API就可以让我们的Web, Android APP, IOS APP, iPad APP, Hybired APP, H5 Web共用共同的逻辑呢? 希望大家学完本次分享课程能够达到使用ASP.NET WebAPI技术,并且掌握如何优雅提供对外API接口。 本次分享课程适合人群范围如下: 1)、对ASP.NET WebApi技术零基础的童鞋们。 2)、对ASP.NET MVC技术零基础但是想快速上手的童鞋们。 3)、本次分享课程属于ASP.NET WebApi基础课程,课程侧重点是零基础快速上手和实战演练。 本次分享课程包含以下干货知识点: 1)、如何快速上手创建一个ASP.NET WebApi应用程序。 2)、API & HTTP接口调试模拟请求工具/插件基本介绍和使用。 3)、如何通过VS快速部署发布我们的WebApi服务应用程序。 4)、ASP.NET WebAPI返回数据同时支持XML和JSON两种格式。 5)、ASP.NET WebAPI自定义HTTP参数绑定支持多参数POST请求。(强烈推荐) 6)、ASP.NET WebAPI如何优雅的通过Action过滤器的方式来实现HTTP压缩。 7)、ASP.NET WebAPI实战演练之客户端应用程序如何调用服务商提供的远程WebApi接口服务。 8)、 Q&A环节:大家一起聊一聊ASP.NET WebAPI 8.1、ASP.NET WebAPI如何优雅的提供对外接口服务。 8.2、ASP.NET WebAPI接口方法如何实现多版本控制。 8.3、ASP.NET WebAPI如何保证客户端以安全的方式进行访问。 如果您同样对本次分享《ASP.NET WebApi技术从入门到实战演练》课程感兴趣的话,那么请跟着阿笨一起学习吧。 废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。 二、什么是WebAPI ? 三、为什么选择WebAPI ? 四、WebApi技术从入门到实战演练实例分享 1)、如何快速上手创建一个ASP.NET WebApi应用程序。 2)、API & HTTP接口调试模拟请求工具/插件基本介绍和使用。 3)、ASP.NET WebAPI返回数据同时支持XML和JSON两种格式。 4)、ASP.NET WebAPI自定义HTTP参数绑定支持多参数POST请求。 5)、ASP.NET WebAPI 如何优雅的通过Action过滤器的方式来实现HTTP压缩。 6)、ASP.NET WebAPI实战演练之WinForm 桌面应用程序如何调用我们的WebApi服务。 五、Q&A环节:大家一起聊一聊ASP.NET WebAPI技术 5.1、ASP.NET WebAPI如何优雅的提供对外接口服务。 5.2、ASP.NET WebAPI接口方法如何实现多版本控制。 5.3、ASP.NET WebAPI如何保证客户端以安全的方式进行访问。 六、总结 本次分享课程需要思考的问题:在移动互联网的时代, Web服务已经成为了异构系统之间的互联与集成的主要手段,各种 Web服务几乎都采用REST风格的Web Api来构建。 通过Http协议的形式来. 以Get/Post方式发送请求, 返回json格式(数据更小巧且自描述能力强)的数据。目前,各大互联网公司, 对自身的REST Api设计有各自的标准,他们的Api 的设计也非常成熟。 那么,我们应该如何更好的设计我们的接口, 来提高我们 API 的可用性,易用性,可维护性与可扩展性呢?由于ASP.NET WEBAPI知识点涉及范围比较广,阿笨本次分享课程侧重点不一样,所以带个大家的知识不能做到面面俱到,大家也可以根据自己的实际工作经验总结一套关于对Restful风格的WebApi架构的知识。 最后还是送大家一句话:师父领进门修行在个人,希望大家在学习的道路上一直坚持下去! 作者:阿笨 官方QQ一群(已满):422315558 官方QQ二群(加入):574187616 个人讲师课堂主页:http://study.163.com/instructor/2544628.htm 个人微信公众号课程主页:http://dwz.cn/ABenNET
《.NET 开源Protobuf-net从入门到精通》课程包含以下两个部分: 一、.NET 开源Protobuf-net组件【数据存储篇】 本次分享课程包含以下干货知识点: 1、什么是Protobuffer? 2、Protobuffer应用场景介绍 3、为什么Protocol Buffer性能这么好? 4、什么是Protobuf-net? 5、ProtoGen工具介绍和使用 6、什么是.proto文件? 7、.proto文件生成cs代码 8、从cs文件反推.proto文件 9、Protobuf-net在线源码学习和演示 1)、ProtobufHelperUnitTest(SingleObject、ListObject、ComplexMulitObject) 2)、ProtobufPlusUnitTest(SingleObject、ListObjectToFile、SingleObjectWithLengthPrefixToFile、ListObjectWithLengthPrefixToFile、InheritObjectToFile) 3)、ProtobufSerializerHelperUnitTest(SingleObject、ListObject) 二、.NET 开源Protobuf-net组件【通讯协议篇】 本次分享课程包含以下干货知识点: 1)、ABenNET.Protobuf.BasicHttp(Protobuf在ASP.NET 一般处理程序ASHX/ASP.NET MVC中的应用)。 2)、ABenNET.Protobuf.WCF(Protobuf在WCF技术中的应用)。 3)、ABenNET.Protobuf.WebApi(Protobuf在ASP.NET WebApi中的应用)。 4)、ABenNET.Protobuf.Socket(Protobuf在Socket网络编程中的应用)。 作者:阿笨 官方QQ一群(已满):422315558 官方QQ二群(加入):574187616 个人讲师课堂主页:http://study.163.com/instructor/2544628.htm 个人微信公众号课程主页:http://dwz.cn/ABenNET
《C#面向服务WebService从入门到精通》包含以下两个部分: 一、《C#远程调用技术WebService修炼手册【基础篇】》本次分享课您将学习到以下干货知识点:1)、WebService技术调用原理图。2)、C# WebService常用的几种调用方式。3)、C# WebService调试小技巧和开发必备工具分享。4)、实战演练之如何通过优雅的方式进行WebService调用。 优不优雅,你看了就知道了,我们尽可能的Write Less Do More !(强烈推荐)。二、《C#远程调用技术WebService葵花宝典【高级篇】》本次阿笨的分享课包含以下方面:1、C# WebService常用的几种调用方式。2、WebService如何使用异步调用。(基于基于异步委托BeginInvoke/EndInvoke、基于委托事件机制、基于Async Task异步编程模式)3、C# WebService如何保证客户端以安全的方式进行访问。4、C#通过反射(Reflection)动态创建WebService实例。5、微软IOC框架Unity的基本使用。 观看地址: http://163.lu/8eLv53 作者:阿笨 官方QQ一群(已满):422315558 官方QQ二群(加入):574187616 个人讲师课堂主页:http://study.163.com/instructor/2544628.htm 个人微信公众号课程主页:http://dwz.cn/ABenNET
一、课程介绍 大家都知道如果想要程序一直运行在windows服务器上,最好是把程序写成windows服务程序;这样程序会随着系统的自动启动而启动,自动关闭而关闭,不需要用户直接登录,直接开机就可以启动。 今天将给大家带来实际项目中经常运用的技术—C# 如何使用创建Windows服务进行应用程序开发。 本课程适合人群如下: 1、有一定的NET开发基础并对Windows服务编程技术有一定了解和认识。 2、进一步加深提高和扩展对Windows服务编程技术的认识视野。 3、喜欢阿笨的干货分享课程的童鞋们。 如果你觉得阿笨的《C# Windows服务开发从入门到精通》分享课程只是仅仅带领大家学习"C#如何一步一步的创建Windows服务应用程序的话,那么你就大错特错了。 阿笨:你说好的给大家带来的干货呢? 如果您同样对本次分享课程感兴趣的话,那么请跟着阿笨一起学习,看看阿笨在实际项目中是如何玩转Windows服务编程技术的吧! 废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。 二、涉及覆盖的知识点 2.1、 C# Windows服务应用程序开发零基础上手入门实战演练。 2.2、通过第三方组件 (Topshelf)创建C# Windows服务应用程序。 2.3、分享C# Windows服务编程在实际项目中的一些小技巧和小技能。 1)、掌握常用 Windows服务操作bat命令。 2)、System.Threading.Timer定时器的妙用 。 3)、如何优雅的调试Windows服务应用程序。 4)、如何为应用程序添加管理员权限。 5)、如何通过bat文件制作 Windows服务安装和卸载一键安装包。 6)、系统项目中有很多后台定时任务,我们该怎么办?阿笨推荐采用"按功能模块划分+ 服务自治的原则",进行管理。 本次分享课程最终目的: 熟练地掌握在实际项目开发中遇到此类需求开发场景能够灵活并高效的以优雅方式创建Windows服务应用程序! 三、概念名称含义解释 3.1、什么是计算机服务? 3.2、什么是Windows服务? 3.3、 什么是 Topshelf ? 四、源码在线解读和演示 4.1、 C# Windows服务应用程序开发零基础上手入门实战演练。 4.1.1、C#编写的Windows服务基本应用流程如下: 1)、如何编写windows服务程序。 2)、如何卸载windows服务程序。 3)、如何调试windows服务程序。 4)、如何安装windows服务程序。 4.2、通过第三方组件 (Topshelf)创建C# Windows服务应用程序。 Install-Package Topshelf Install-Package Topshelf.Log4Net github官网地址:https://github.com/Topshelf/Topshelf 4.3、分享C# Windows服务编程在实际项目中的一些小技巧和小技能。 1)、掌握常用 Windows服务操作bat命令。 2)、System.Threading.Timer定时器的妙用 。 如何灵活的解决我们实际项目中经常遇到的定时器执行时间和间隔时间出现的并发问题。 3)、如何优雅的调试Windows服务应用程序 4)、 如何为应用程序添加管理员权限。 5)、 如何通过bat文件制作 Windows服务安装和卸载一键安装包 6)、系统项目中有很多后台定时任务,我们该怎么办?阿笨推荐采用"按功能模块划分+ 服务自治的原则“,进行管理。 五、总结 如果您想更加全面的学习一下关于阿笨项目中使用Windows服务应用程序的实战技能,推荐大家可以学习一下阿笨早期之前分享的《.NET线程池技术项目实战演练》课程。俗话说的好:师父领进门修行在个人,希望大家在学习的道路上一直坚持下去! 作者:阿笨 官方QQ一群(已满):422315558 官方QQ二群(加入):574187616 个人讲师课堂主页:http://study.163.com/instructor/2544628.htm 个人微信公众号课程主页:http://dwz.cn/ABenNET
1、既然要谈到sql,数据库表是必须的 2、数据结构 3、获取某个节点的所有子节点 传统的写法(sql2000) 很麻烦,暂且就不写了 来看看CTE的写法 CREATE PROC sp_getTreeById(@TreeId int) AS BEGIN WITH cteTree AS (SELECT * FROM TuziTree WHERE Id = @TreeId --第一个查询作为递归的基点(锚点) UNION ALL SELECT TuziTree.* --第二个查询作为递归成员, 下属成员的结果为空时,此递归结束。 FROM cteTree INNER JOIN TuziTree ON cteTree.Id = TuziTree.ParentId) SELECT * FROM cteTree END 测试一下啊 exec sp_getTreeById @TreeId=1001 结果 ----------------------------------------------- 4、使用节点路径来做(每个节点路径都保存自身的路径和所有父节点的路径=自己和所有父节点的关联) 5、既然有个路径 那么查询其所有子节点 只需要 where nodePath like '/1001/%'了 这样就会简单很多,加上索引。 总结: 如果在性能的需要上,我们可以采用按需加载,点击节点时候 才会加载其所有子节点。 如果在变化不大的情况下,可以采用缓存 。这样的处理 可以满足很多业务需求。 良好的表设计会给后期的开发以及需求变化 带来更多的便利。 作者:阿笨 官方QQ一群(已满):422315558 官方QQ二群(加入):574187616 个人讲师课堂主页:http://study.163.com/instructor/2544628.htm 个人微信公众号课程主页:http://dwz.cn/ABenNET
一、课程介绍 我们都知道在软件架构方式分为:C/S和B/S两类。这里阿笨不谈论两种软件架构的优劣之分,因为它们各有千秋,用于不同场合。一位伟大的讲师曾经说过一句话:事物存在即合理!录制这堂课程的目的就是专门给想学习和了解WinForm应用程序的童鞋们。虽然当前主流的架构开发的确大多是WEB端和App移动端开发,可能大家都忽略了传统的WinForm桌面应用程序开发的魅力! 如果您对本次分享《 WinForm企业级框架实战项目演练 》课程感兴趣的话,那么请跟着阿笨一起玩WinForm吧!阿笨将从自己实战项目经验角度出发,带领大家快速上手WinForm企业级应用程序开发从入门到精通,实际感受一下C/S软件架构模式的开发效率! 废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。 二、WinForm框架在线学习和演示 2.1、WinForm实战技能之常用两种软件架构模式学习 1)、两层架构设计。(表示层—数据层) 两层架构 2)、三层架构设计。(表示层—应用层—数据层) 三层架构 2.2、WinForm实战技能之常用登录模块设计 1)、简单漂亮的登录模块以及友好的系统消息展示。 2)、漂亮的Spalsh启动动画。 2.3、WinForm消息右下角弹出显示控件 1、类似QQ右下角弹出显示控件NotifyWindow。 2.4、WinForm实战技能之玩转多文档页签控件 1)、开源WeifenLuo.WinFormsUI.Docking多文档页签控件了解和掌握。 2.5、WinForm实战技能之玩转导航菜单控件 1)、开源UtilityLibrary导航栏菜单控件了解和掌握。 2.6、WinForm实战技能之玩转ComboBox控件 1)、如何优雅的绑定下拉列表ComboBox数据源。 2.7、WinForm实战技能之玩转TreeView控件 1)、TreeView控件常用技巧了解和掌握。 2)、TreeView控件美化。 2.8、WinForm实战技能之玩转DataGridView列表控件 1)、如何优雅的绑定 DataGridView数据源(BindingList)。 2.9、WinForm实战技能之玩转Loading等待控件 1)、如何通过多线程技术实现类似“数据加载...Loading”窗体加载显示控件。 2)、如何实现带百分比进度显示的 “数据加载...Loading” 加载显示控件。 3.0、WinForm实战技能之玩转分页Page控件 1)、如何优雅的使用分页Page控件。 三、总结 俗话说的好:师父领进门修行在个人!阿笨分享给大家的这一套WinForm开发框架,具备轻量便捷,快速上手、简单使用这些特点。只要您认真的学完《 WinForm企业级框架实战项目演练 》课程,以后在工作中可以轻轻松松的应对一般小型的桌面应用客户端管理系统的开发工作。 四、课程在线观看 作者:阿笨 官方QQ一群(已满):422315558 官方QQ二群(加入):574187616 个人讲师课堂主页:http://study.163.com/instructor/2544628.htm 个人微信公众号课程主页:http://dwz.cn/ABenNET
一、课程介绍 关于如何实现“WinForm多语言版本”网上有很多实现技术方案,可以说是“琳琅满目”,"包罗万象"。俗话说的好:一千个读者就有一千个哈姆雷特!如果您工作中恰好也遇到这种开发需求,但是为了一个自上手简单、维护方便、扩展性强的WinForm多语言版本技术方案而感到烦恼的话,那么很高兴恭喜你看到了阿笨的本次分享课程;阿笨结合的是自己在实际工作中遇到真实项目案例,特别的总结并且分享出来给大家,从而避免重复造轮子这种事情。 如果您对本次分享《WinForm多语言版本实战项目演练》课程感兴趣的话,那么请跟着阿笨一起学习吧。 废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。 二、涉及覆盖的知识点 2.1、掌握XML、JSON序列化和反序列化常用技术手段。 2.2、 WinForm桌面应用程序实战开发小技巧和技能。 2.3、如何优雅实现 WinForm 程序的界面多语言版本。 2.4、如何 优雅 实现在运行时切换 WinForm 程序的界面语言。 2.5、面向对象编程( OOP )设计技巧实战运用,实现应用程序的“高聚集、低耦合”。 三、实现原理和方案解读 3.1、关于多语言处理实现方案有几下几种: 3.2、关于多语言实现原理如下: 一句话:WinForm应用程序读取指定的语言包配置文件(.xml,json,data等自定义格式文件) 多语言实现原理图 四、实战演练源代码在线演示和解读 五、总结 作者:阿笨 官方QQ一群(已满):422315558 官方QQ二群(加入):574187616 个人讲师课堂主页:http://study.163.com/instructor/2544628.htm 个人微信公众号课程主页:http://dwz.cn/ABenNET
一、课程介绍 今天阿笨给大家带来一堂NOSQL的课程,本期的主角是Redis。希望大家学完本次分享课程后对redis有一个基本的了解和认识,并且熟悉和掌握 Redis在.NET中的使用。 本次分享课程包含以下知识点: 1、StackExchange.Redis (简称:SE)驱动在C#中Redis几种数据结构学习和使用。 2、ServiceStack.Redis ( 简称: SS) 驱动在C#中Redis几种数据结构学习和使用。 3、Redis主从集群服务器搭建和学习。 4、在ASP.NET中Redis如何进行Session托管。 5、在C#中如何使用Redis的生产者/消费者。 6、在C#中如何使用Redis的发布/订阅功能。 7、在C#中如何使用Redis的事务、锁。 如果您同样对本次分享《.NET分布式缓存Redis从入门到实战》课程感兴趣的话,那么请跟着阿笨一起学习吧。 废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。 二、概念名称含义解释 2.1、什么是Redis? 2.2、Redis特点 三、Redis For Windows安装手册 3.1、Redis 在Windows系统上的安装 3.2、Redis服务器主从集群的搭建 四、Redis几种数据结构 1、String( 字符串 ) 2、List(列表) 3、Hash( 哈希 ) 4、Set( 集合 ) 5、Sorted Set(有序集合) 五、Redis应用场景介绍 六、Redis在.NET中的使用 1、StackExchange.Redis (简称SE) 2、ServiceStack.Redis(简称SS) 六、Redis实战演练分享 1、StackExchange.Redis (SE)驱动在C#中Redis几种数据结构学习和使用。 2、ServiceStack.Redis (SS) 驱动在C#中Redis几种数据结构学习和使用。 3、 Redis主从集群服务器搭建和学习。 4、在ASP.NET中Redis如何进行Session托管。 5、在C#中如何使用Redis的生产者/消费者。 6、在C#中如何使用Redis的发布/订阅功能。 7、在C#中如何使用Redis的事务、锁。 七、源码在线学习和演示 在线观看地址:跟着阿笨一起玩NET 微信公众号:ABenDotNet 八、总结 在线观看地址:跟着阿笨一起玩NET 微信公众号:ABenDotNet
一、课程介绍 本次分享课程属于《C#高级编程实战技能开发宝典课程系列》中的第四部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集、整理和完善此系列课程!本高级系列课程适合人群如下: 1、有一定的NET开发基础并对WebApi、Task、WebSocket技术有一定了解和认识。 2、喜欢阿笨的干货分享课程的童鞋们。 希望大家在选择阿笨的 C#高级编程实战技能开发宝典课程系列的时候,根据自身的情况进行选择,由于本次课程不是零基础教学课程系列,所以说.NET基础差的到了没朋友的地步话,那阿笨建议您还是先“学”好NET的一些基础知识,然后在来C#跟着阿笨“玩” 本次分享课来源灵感是阿笨在实际项目中经验碰到的一个真实的业务场景 ,如果您同样对本次分享《C# WebApi+Task+WebSocket实战项目演练》课程感兴趣的话,那么请跟着阿笨一起学习吧。 废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。 二、实战项目背景 环境的局限性: 用户在使用XX客户端的时候,必须每台电脑都安装打印组件,同时由于XX客户端使用的是 websocket进行通讯,这就必须限制用户的电脑浏览器必须是IE10.0+以上版本,这种局限性在我们公司仓库部署实施和用户体验极其不好。因此我们必须提供一种解决方案,解决我们业务痛点。 同步: 同步 异步: 异步 一句话:今天我们要解决的核心技术问题? C#如何以同步方式获取异步事件回调的结果。 1)、解决手段一: 通过 Task+AutoResetEvent机制实现同步阻塞获取异步事件回调的结果。 2)、解决手段二: 通过 Task +CancellationTokenSource 三、涉及覆盖的知识点 1、webapi简单的熟悉使用。达到目标可以提供对外接口,返回XML和JSON数据格式。 2、HTTP 模拟工具的简单使用。 3、基于SuperSocket通讯框架的Websocket客户端简单的使用。 4、C#如何以同步方式获取异步事件回调的结果。(重点学习) 四、源码在线演示和解读 4.1、项目分析结构图 两层模式 两层模式 三层模式 三层模式 四、总结 希望大家在学习一门新的语法或者技术的时候,能够与自己的实际场景项目相结合,这样才能够更好的理解和认识。做到学以致用!希望大家学完本次分享课程后对ASP.NET WebApi、异步Task、WebSocket有一个基本的了解和认识。# WebApi+Task+WebSocket实战项目演练 俗话说的好:师父领进门修行在个人,希望大家在学习的道路上一直坚持下去! 五、 源码在线观看地址 在线观看地址:跟着阿笨一起玩NET 微信公众号:ABenDotNet
一、课程介绍 本次分享课程属于《C#高级编程实战技能开发宝典课程系列》中的第三部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集、整理和完善此系列课程!本次高级系列课程适合人群如下: 1、有一定的NET开发基础并对Socket技术有一定了解和认识。 2、喜欢阿笨的干货分享课程的童鞋们。 希望大家在选择阿笨的 C#高级编程实战技能开发宝典课程系列的时候,根据自身的情况进行选择,由于本次课程不是零基础教学课程系列,所以说.NET基础差的到了没朋友的地步话,那阿笨建议您还是先“学”好NET的一些基础知识,然后在来跟着阿笨一起 “玩” !如果您同样对本次分享《C#网络编程技术微软Socket实战项目演练》课程感兴趣的话,那么请跟着阿笨一起学习吧。 本期课程阿笨给大家带来两个基于.NET微软自带的Socket类库开发的实战项目演示实例: 1、基于.NET微软自带的Socket类库开发的客户端和服务端聊天应用程序(ABenNET.Socket.AppChat)。 2、基于.NET微软自带的Socket类库开发的在线客户端监控应用程序(ABenNET.Socket.AppMonitor)。 废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。 二、 微软Socket类库介绍 基于.NET框架自带的原生微软Socket类库相比FastSocket和SuperSocket这两大通信框架也有一定的优势: 1、支持.NET FrameWork 2.0 + 框架。 2、简单、上手、轻量级。 一位伟大的讲师曾经说过一句话:麻雀虽小肝胆俱全! 三、实战演练源代码在线演示和解读 实战截图一 实战截图二 实战截图三 四、总结 如果您只是想学习和了解一下Socket网络编程技术的基本运用的话,完全可以学习阿笨分享的这个基于.NET框架自带的原生微软Socket类库实现AppMonitor实战项目;如果对socket框架的稳定性要求和灵活性比较高以及需要实现一些自定义的高级通信协议的话,建议您还是学习《C#网络编程技术FastSocket实战项目演练》和《C#网络编程技术SuperSocket实战项目演练》课程。FastSocket和SuperSocket两大框架我们根据自己的实际项目如何进行选择,可以在阿笨的公众号中底部栏中找到“我们到底选择哪一款开源的Socket框架?”这篇文章,里面有比较全面的对比这两大开源框架的异同点和优势,希望能够帮助您更好的选择。俗话说的好:师父领进门修行在个人,希望大家在学习的道路上一直坚持下去! 五、实例源码在线学习和演示 在线观看地址:跟着阿笨一起玩NET 微信公众号:ABenDotNet
一、课程介绍 本次分享课程属于《C#高级编程实战技能开发宝典课程系列》中的第二部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集、整理和完善此系列课程!本次高级系列课程适合人群如下: 1、有一定的NET开发基础并对RabbitMQ技术有一定了解和认识。 2、喜欢阿笨的干货分享课程的童鞋们。 希望大家在选择阿笨的 C#高级编程实战技能开发宝典课程系列的时候,根据自身的情况进行选择,由于本次课程不是零基础教学课程系列,所以说.NET基础差的到了没朋友的地步话,那阿笨建议您还是先“学”好NET的一些基础知识,然后在来跟着阿笨一起 “玩” !如果您同样对本次分享《C#多线程技术提高RabbitMQ消费吞吐率》课程感兴趣的话,那么请跟着阿笨一起学习吧。废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。 二、实战项目背景 问题:大家在使用多线程技术消费RabbitMQ消息队列的时候是否遇到过下面这个异常问题? None of the specified endpoints were reachable。 如果是在使用RabbitMQ过程中通过多线程技术的时候遇到的,那恭喜您在阿笨这里找到了解决办法!因为阿笨在实际工作中也遇到过同样的问题哈。 一句话:今天我们要解决的核心技术问题? C#如何通过多线程技术提高RabbitMQ消费的吞吐率! 三、多线程消费MQ实例分享 1)、C#如何通过多线程方式消费MSMQ消息。 如果您对多线程方式消费MSMQ消息感兴趣的话,可以关注一下阿笨之前分享的《C#消息队列(MQ)零基础从入门到实战演练》课程。 2)、C#如何通过多线程方式提高RabbitMQ消费者的消费吞吐率。 四、 总结 如果您想更加全面的学习RabbitMQ的实战技能,推荐大家可以学习一下阿笨早期之前分享的《C#消息队列(MQ)零基础从入门到实战演练》课程。俗话说的好:师父领进门修行在个人,希望大家在学习的道路上一直坚持下去! 五、源码在线学习和演示 在线观看地址:跟着阿笨一起玩NET 微信公众号:ABenDotNet
一、课程介绍 本次分享课程属于《C#高级编程实战技能开发宝典课程系列》中的第一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集、整理和完善此系列课程! 本高级系列课程适合人群如下: 1、有一定的NET开发基础并对多线程技术有一定了解和认识。 2、喜欢阿笨的干货分享课程的童鞋们。 希望大家在选择阿笨的 C#高级编程实战技能开发宝典课程系列的时候,根据自身的情况进行选择,由于本次课程不是零基础教学课程系列,所以说.NET基础差的到了没朋友的地步话,那阿笨建议您还是先“学”好NET的一些基础知识,然后在来C#跟着阿笨“玩”一起玩异步Task实战! 如果您同样对本次分享《C#跟着阿笨玩一起玩异步Task实战》课程感兴趣的话,那么请跟着阿笨一起学习吧。 废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。 二、概念名称含义解释 2.1、多线程和异步两者的区别和联系? 一、区别: 1)、异步适用范围则是当需要执行I/O操作时。I/O操作包括了直接的文件、网络的读写,还包括数据库操作、Web Service、HttpRequest以及.net Remoting等跨进程的调用。 2)、线程适用范围则是那种需要长时间CPU运算的场合,例如耗时较长的图形处理和算法执行。 但是往往由于使用线程编程的简单和符合习惯,所以很多朋友往往会使用线程来执行耗时较长的I/O操作。 二、联系: 1)、多线程和异步操作两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性。 2)、异步的本质也是多线程。 详细关于两者的区别和联系,推荐下面博客: 《C#多线程与异步的区别》《如何正确运用异步编程技术》 三、异步Task实战实例分享 3.1)、C#使用异步Task实现查询等待Loading中效果。 3.2)、C#使用Task实现多任务批量处理。 3.3)、C#如何优雅的将同步方法转化为异步方法。 3.4)、 C#如何以同步方式获取异步事件回调的结果。 1)、解决手段一: 通过 Task+AutoResetEvent机制实现异步阻塞获取异步事件回调的结果。 2)、解决手段二:通过 Task +CancellationTokenSource( 课后请自行思考) 四、总结 如果您想更加全面的学习一下关于阿笨使用异步Task技术在项目当中的实战技能,推荐大家可以学习一下阿笨早期之前分享的《C#实战技能之WebApi+Task+WebSocket》课程。俗话说的好:师父领进门修行在个人,希望大家在学习的道路上一直坚持下去! 五、源码在线学习和演示 在线观看地址:跟着阿笨一起玩NET 微信公众号:ABenDotNet
一、前言 Protocol Buffer(简称Protobuf或PB) 是一个跨平台的消息交互协议,类似xml、json等 ;别只会用Json和XML了,快来看看Google出品的Protocol Buffer!由于是Google的出品,我相信Protocol Buffer已经具备足够的吸引力。如果您对本次分享《.NET开源Protobuf-net组件修炼手册》课程感兴趣的话,那么请跟着阿笨一起学习吧。 废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。 二、概念名称含义和解释 2.1、什么是Protobuffer? Protocol Buffer(简称Protobuf或PB)是由Google推出的一种数据交换格式,与传统的XML和JSON不同的是,它是一种二进制格式,免去了文本格式转换的各种困扰,并且转换效率也是非常快,由于它的跨平台、跨编程语言的特点,让它越来越普及,尤其是网络数据交换方面日趋成为一种主流。 Protobuf 官网:https://github.com/google/protobuf/tree/master/csharp 2.2、Protobuffer应用场景介绍 2.3、为什么Protocol Buffer性能这么好? 2.4、什么是Protobuf-net? 三、ProtoGen工具介绍和使用 3.1、什么是.proto文件? 3.2、.proto文件生成cs代码 3.3、从cs文件反推.proto文件 四、Protobuf-net在线源码学习和演示 1、ProtobufHelperUnitTest(SingleObject、ListObject、ComplexMulitObject) 2、ProtobufPlusUnitTest(SingleObject、ListObjectToFile、SingleObjectWithLengthPrefixToFile、ListObjectWithLengthPrefixToFile、InheritObjectToFile) 3、ProtobufSerializerHelperUnitTest(SingleObject、ListObject) 在线源码演示 五、Protobuf思考与总结 5.1、Protobuf优点和缺点 1)、优点: 2)、缺点: 5.2、总结 希望大家学完本次《.NET开源Protobuf-net组件修炼手册》课程后,让您对Protobuf有一个深刻的了解和认识。下一趟课程阿笨将给大家带来Protobuf的高级进修课程《.NET开源Protobuf-net组件葵花手册》,在高级课程中阿笨将带领大家学习Protobuf在HTTP一般处理程序、 WCF、ASP.NET MVC/WebApi中的运用。如果感兴趣的话,到时候跟着阿笨一起学习吧! 六、源码在线观看 在线观看地址:跟着阿笨一起玩NET 微信公众号:ABenDotNet
一、前言 我们都知道 protobuf是由Google开发的一款与平台无关,语言无关,可扩展的序列化结构数据格式,可用做数据存储格式, 通信协议 ! 在前面《.NET开源Protobuf-net组件修炼手册》基础入门课程中我们已经对Google的Protobuf有了一个比较全面的了解和认识,本次高级进修课程主要的侧重点是讲解 Protobuf 通信协议应用。 那么 Protobuf 通信协议的应用将在本次分享课程进行讲解。 我们应用程序如何实现基于Protobuf协议的通信呢?阿笨本次分享课程将带领大家学习Protobuf在.NET中HTTP、WCF、WebApi、Socket中的运用。如果您同样对本次分享《.NET开源Protobuf-net组件葵花手册》课程感兴趣的话,那么请跟着阿笨一起学习吧。 废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。 二、涉及覆盖的知识点 1)、ABenNET.Protobuf.BasicHttp(Protobuf在ASP.NET 一般处理程序ASHX/ASP.NET MVC中的应用)。 2)、ABenNET.Protobuf.WCF(Protobuf在WCF技术中的应用)。 3)、ABenNET.Protobuf.WebApi(Protobuf在ASP.NET WebApi中的应用)。 4)、ABenNET.Protobuf.Socket(Protobuf在Socket网络编程中的应用)。 三、总结 我们学习一门新技术切记囫囵吞枣。希望大家学完Protobuffer后不要仅仅只是为了技术而技术,立刻就将自己项目中的序列化组件替换掉。还是要根据项目实际情况来考察,不要为了盲目的追求所谓效率和性能的提升,从而导致顾此失彼。曾经 有一位讲师说过这么一句话:衡量一个系统的性能效率是有很多方面的因素,我们要从中找到问题的主要矛盾。还是那句话适合自己的就是最好的! 四、实例源码在线学习和演示 在线观看地址:跟着阿笨一起玩NET 微信公众号:ABenDotNet
一、摘要 一说到ADO.NET大家可能立刻想到的就是增、删、改、查(CRUD)操作,然后再接就想到项目中的SQLHelper。没错本课分享课阿笨给大家带来的是来源于github上开源的DAO数据库访问组件DBHelpers。如果您对本次分享《.NET轻量级DBHelpers数据访问组件》课程感兴趣的话,那么请跟着阿笨一起学习吧。 废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。 二、涉及覆盖的知识点 2.1、原生ADO.NET简单的CRUD(增删改查) Insert、Insert_Batch、Update、Update_Batch、Delete、Exist、GetById、GetByIds、GetList GetByIdAutomaticTypeConversion、GetListByPage(内置分页)、GetListReturnDataTable GetListReturnDataSet、GetListReturnDictionary、 ExecuteWithDBTransaction(本地DbTransaction事务操作)、 ExecuteWithTransactionScope(分布式TransactionScope事务操作) 2.2、ADO.NET在异步编程(Asyn Task)中的运用 InsertAsync、GetByIdAsync、GetListAsync ExecuteNonQueryAsync、ExecuteObjectAsync、ExecuteListAsync 2.3、原生ADO.NET高级技巧修炼手册 CreateOrder(创建订单(采用sql拼接+for循环方式))。 CreateOrderByStoredProcedures_XMLPath创建订单(采用生成XML+SQL XML数据类型的XMLPath方式)。 Transact-SQL存储过程in输入、out输出、Return参数的运用。 三、什么是ADO.NET? 1)、ADO.NET是微软新一代.NET数据库的访问架构,ADO是ActiveX Data Objects的缩写。ADO.NET是数据库应用程序和数据源之间沟通的桥梁,主要提供一个面向对象的数据访问架构,用来开发数据库应用程序。 2)、ADO.NET 是 .NET 框架(.NET Framework)中的一个类库,用于实现 .NET 应用程序对于数据库的访问,主要包括 DbConnection,DbCommand,DataSet,DataAdapter 与 DataReader 等。 3)、ADO.NET五大对象分别是: 1、Connection(连接数据库) 2、Command(执行T-SQL语句) 3、DataAdapter(用户填充DataSet,断开模式) 4、DataReader(读取数据库,一种只读模式,只向前的) 5、DataSet(数据集,好比电脑的内存) ADO.NET五大对象 四、DBHelpers介绍 4.1、DBHelpers是什么? DBHelpers是一个简单但功能强大的库,用于使用简单的ADO.NET数据库访问组件。 4.2、DBHelpers包含哪些特征 Async(异步)、Batch execution(批量执行脚本)、Custom converters(自定义类型转换)、 Multi table retrieval(多结果集查询)、Easy safe parameterized DbCommand(简单安全的参数化)、 Automatic mapping of objects(自动映射类型)、Built in paging support(内置支持分页)、等等。 4.3、DBHelpers内置方法 ExecuteNonQuery、ExecuteReader、ExecuteScalar、 ExecuteDataTable、ExecuteDataSet、ExecuteArray、ExecuteDictionary、ExecuteObject、ExecuteList、 ExecuteNonQueryAsync、ExecuteObjectAsync、ExecuteListAsync 4.3、github下载地址: https://github.com/nvivo/dbhelpers 4.4、nuget安装: Install-Package DBHelpers 五、DBHelpers在线学习和演示 在线观看地址:跟着阿笨一起玩NET 六、小结 如果您想更进一步的在ADO.NET的世界里畅行无阻,横行天下,那么阿笨推荐您学习另外两套课程《.NET轻量级ORM框架Dapper修炼手册》和《.NET轻量级ORM框架Dapper葵花宝典》。 阿笨希望带来的自己对ADO.NET编程技术的一些理解和认识吧,力争将DAO技术的真真干货内容分享给大家。这就是阿笨的课程与市面上最大的不同点,"理论+实战相结合"+"从实战从来到实战中去",学完后直接将学习成果运用到实际项目中去!
作者:CHEN川 链接:http://www.jianshu.com/p/453c6e7ff81c 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 一、摘要 分布式消息系统作为实现分布式系统可扩展、可伸缩性的关键组件,需要具有高吞吐量、高可用等特点。而谈到消息系统的设计,就回避不了两个问题: 1、消息的顺序问题 2、消息的重复问题 二、关键特性以及其实现原理 2.1、顺序消息 要实现严格的顺序消息,简单且可行的办法就是: 保证生产者 - MQServer - 消费者是一对一对一的关系 这样的设计虽然简单易行,但也会存在一些很严重的问题,比如: 1、并行度就会成为消息系统的瓶颈(吞吐量不够) 2、更多的异常处理,比如:只要消费端出现问题,就会导致整个处理流程阻塞,我们不得不花费更多的精力来解决阻塞的问题。 但我们的最终目标是要集群的高容错性和高吞吐量。这似乎是一对不可调和的矛盾,那么阿里是如何解决的? 有些问题,看起来很重要,但实际上我们可以通过合理的设计或者将问题分解来规避。如果硬要把时间花在解决问题本身,实际上不仅效率低下,而且也是一种浪费。从这个角度来看消息的顺序问题,我们可以得出两个结论: 1、不关注乱序的应用实际大量存在 2、队列无序并不意味着消息无序 2.2、消息重复 上面在解决消息顺序问题时,引入了一个新的问题,就是消息重复。那么MQ是怎样解决消息重复的问题呢?还是“恰好”不解决。 造成消息的重复的根本原因是:网络不可达。只要通过网络交换数据,就无法避免这个问题。所以解决这个问题的办法就是不解决,转而绕过这个问题。那么问题就变成了:如果消费端收到两条一样的消息,应该怎样处理? 1、消费端处理消息的业务逻辑保持幂等性 2、保证每条消息都有唯一编号且保证消息处理成功与去重表的日志同时出现 第1条很好理解,只要保持幂等性,不管来多少条重复消息,最后处理的结果都一样。第2条原理就是利用一张日志表来记录已经处理成功的消息的ID,如果新到的消息ID已经在日志表中,那么就不再处理这条消息。 我们可以看到第1条的解决方式,很明显应该在消费端实现,不属于消息系统要实现的功能。第2条可以消息系统实现,也可以业务端实现。正常情况下出现重复消息的概率不一定大,且由消息系统实现的话,肯定会对消息系统的吞吐量和高可用有影响,所以最好还是由业务端自己处理消息重复的问题,这也是MQ不解决消息重复的问题的原因。 MQ不保证消息不重复,如果你的业务需要保证严格的不重复消息,需要你自己在业务端去重。 三、阅读原文 在线观看地址:跟着阿笨一起玩NET 微信公众号:ABenDotNet
一、课程介绍 一位伟大的讲师曾经说过一句话:事物存在即合理!意思就是说:任何存在的事物都有其存在的原因,存在的一切事物都可以找到其存在的理由,我们应当把焦点放在因果关联的本质上。所以在本次分享课开课之前,我们要“约法三章”不谈论以下几个比较“严肃”和“敏感”的话题:WebService已经过时了啦,学习它干什么用啊!为什么要用WebService,而不用基于当前流行的RestFul ASP.NET WebAPI ? 对于上面的问题阿笨的回答很简单:因为它就是它,不一样烟火的WebService! 本次分享课您将学习到以下干货知识点: 1)、WebService技术调用原理图。 2)、C# WebService常用的几种调用方式。 3)、C# WebService调试小技巧和开发必备工具分享。 4)、实战演练之如何通过优雅的方式进行WebService调用。 优不优雅,你看了就知道了,我们尽可能的Write Less Do More !(强烈推荐) 在此插播一条硬广告:下一堂分享课程阿笨计划将给大家带来《C#远程调用技术WebService葵花宝典》,课程的重点将给大家分享一下“C# WebService两种不同引用使用方式”,“WebService如何使用异步调用”以及“关于C# WebService如何让客户端以安全的方式进行调用目前常用几种的解决方案”等等。阿笨尽量给大家带来一些干货分享! 如果您对本次分享课感兴趣的话,那么请跟着阿笨一起学习吧。废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。 hi大家好,我的名字叫WebService! 二、概念名称含义解释 2.1、什么是远程调用技术(简称:RPC技术)? 一个系统远程调用另一个系统的服务,来获取远程系统的业务数据。 2.2、为什么使用RPC技术? 基于安全性的考虑,一般企业不会开放自己的数据库,只能使用远程调用技术。 2.3、什么是SOAP? SOAP:(Simple Object Access Protocol)简单对象存取协议。SOAP最早是针对RPC的一种解决方案;SOAP是XML文档形式的调用方法的规范。 2.4、什么是WebService? WebService是一种使用HTTP传输的SOAP协议的远程调用技术。 2.5、WebService采用的是什么通信协议? WebService 采用的的基本通信协议是SOAP ,它是在分散或分布式环境中交换信息,它基于XML的协议,通过SOAP协议可以实现不同项目、不同地点、甚至异地调用应用程序。 2.6、为什么说WebService是跨平台的? 实际上,WebService 的主要目标是跨平台的可互操作性。为了达到这一目标,WebService 完全基于XML (可扩展标记语言)、XSD (XMLSchema )等独立于平台、独立于软件供应商的标准,是创建可互操作的、分布式应用程序的新平台。 2.7、WebService实现包含那三要素? WSDL作用:webservice服务端的使用说明书。(Web Service Description Language) SOAP作用:规范XML标签。 UDDI:提供webservice服务端的搜索和注册功能。 2.8、WebService有哪些优势? 1)、可操作的的分布式应用程序。 可以实现不同应用程序和在不同系统平台上开发出来的应用程序之间通信。 2)、普遍性、使用HTTP和XML进行通信。 任何支持HTTP和XML 技术的设备都可以拥有和访问Web Service,不同平台不同开发语言照样可以调用我们发布的Web Service。 3)、Web Service 甚至可以穿越防火墙,真正的自由通信。 一般要访问的Web服务器以及要访问的Web Service的客户端很可能位于防火墙后面,都默认关闭其它端口而开发HTTP端口,而Web service 正是基于HTTP的,所以它可以穿越防火墙. 4)、异构平台之间的互通性。 Web Service 最大的优势是提供了异构平台的无缝街接技术手段。由于不同的用户使用不同的硬件平台,不同的操作平台,不同的操作系统,不同的软件,不同的 协议通信,这就产生了互相通信的需求。 Web Service 使任何两个应用程序,只要能读写XML,那么就能互相通信。 通过 SOAP 协议实现异地调用。 小结: 阿笨用通俗一点语言解释就是在当前C#、JAVA、PHP等语言都可以使用标准的WebService技术实现不同语言的应用程序之间进行互相通信,即互相调用。 三、WebService技术调用原理图 WebService工作原理图一 WebService工作原理图二 3.1、Webservice是如何实现远程调用?三要素在webservice的作用? (1)Webservice原理:webservice是一种使用http传输的SOAP协议的数据的远程调用技术。 (2) WSDL作用:webservice服务端的使用说明书。(Web Service Description Language) (3)SOAP作用:规范XML标签。 (4) UDDI:提供webservice服务端的搜索和注册功能。 3.2、WebService关键原理说明: 服务者:发布者需要部署Webservice服务应用程序。 调用者:客户端需要参考webservice服务端的使用说明书(WSDL)进行调用。 四、C# WebService常用的几种调用方式 4.1、C#通过Dynamic动态调用WebService。 其实与手工创建添加引用步骤一样,只是在这里把手动变成了自动而已,动态生成代理类,利用反射动态调用了方法。详细请参考:[C#通过Dynamic动态调用WebService.pdf]文档。 4.2、C#通过模拟HTTP请求协议Get、POST方式进行调用WebService。(根据个人项目情况使用) 详细请参考:[C#通过模拟HTTP请求协议Get、POST方式进行调用WebService.pdf]文档。 4.3、通过手动生成客户端WSDL代理类进行调用。(根据个人项目情况使用) 采用微软给我们提供的wsdl.exe工具生成wsdl本地代理类。 4、通过SOAP协议手动引用方式进行调用。(微软强烈推荐) 五、C# WebService调试小技巧和开发必备工具分享 5.1、C# 如何调试WebService服务以及调试远程Web服务。 详细请参考[C# WebService如何远程调试.pdf] 5.2、Webservice调试利器 1、微软提供的.NET WebService Studio 下载地址:http://webservicestudio.codeplex.com/ 2、Storm (推荐) 下载地址:http://storm.codeplex.com/ ,顺便提及下该工具还有一个它的“同胞兄弟”叫 WCF Storm 哦。 3、soapui(强烈推荐) 下载地址:https://www.soapui.org/downloads/latest-release.html 六、实战演练之如何通过优雅的方式进行WebService调用 统一入口获取指定T类型的WebService服务实例 客户端调用者将采用统一入口进行访问 七、WebService修炼手册在线学习和演示 在线观看地址:跟着阿笨一起玩NET 微信公众号:ABenDotNet
引用 寄宿ASP.NET Web API 不一定需要IIS 的支持,我们可以采用Self Host 的方式使用任意类型的应用程序(控制台、Windows Forms 应用、WPF 应用甚至是Windows Service)作为宿主。 一、摘要 本期同样带给大家分享的是阿笨在实际工作中遇到的真实业务场景,请跟随阿笨的视角去如何实现采用微软的ASP.NET OWIN技术承载WebAPI服务,如果您对本期的教程内容感兴趣,那么请允许让阿笨带着大家一起学习吧! 废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。 你想要的干货都在这 四、需求分析 4.1、上期回顾 上一期我们分享了基于开源SuperSocket实现客户端和服务端通信项目实战实现了WEB网页提交打印数据给WEB服务端,WEB服务端将接受的打印数据通过Socket通讯服务器推送给指定的客户端。 我们能否简化上面的调用过程步骤呢? 直接让客户端将打印数据给本地的客户端,而无须再通过Socket通讯服务器进行中转。 4.2、原理图 原理图 4.3、那么我们今天要解决的问题可以总结为下面的一句话: 如何让WEB网页端直接以HTTP方式访问本地桌面客户端,就像访问远程IIS上的Web应用程序一样? 4.4、实现WEB应用程序的Self-Host解决方案 通过HttpListener实现简单的Http服务(.NET 2.0+) 基于WCF堆栈的自宿主SelfHosting 采用ASP.NET HttpSelfHost来承载WebAPI服务 (.NET 4.0+) 采用ASP.NET OWIN来承载WebAPI服务(.NET4.5微软推荐使用) 等等...... 五、涉及覆盖的知识点 ASP.NET WebAPI HttpSelfHost/OWIN 如何以桌面应用程序方式,宿主承载WebApi服务; ASP.NET WebAPI HttpSelfHost/OWIN 如何让服务端支持CROS跨越访问; IE10.0 以下浏览器通过XDomainRequest实现CORS访问; 六、源码在线解读和演示 在线观看地址:跟着阿笨一起玩NET 微信公众号地址:ABenDotNet
一、项目背景介绍 最近单位开发一个项目,其中需要用到自动升级功能。因为自动升级是一个比较常用的功能,可能会在很多程序中用到,于是,我就想写一个自动升级的组件,在应用程序中,只需要引用这个自动升级组件,并添加少量代码,即可实现自动升级功能。因为我们的程序中可能包含多个类型的文件,比如exe、dll、 config、xml、bat等等自定义格式的后缀名文件,所以要支持多文件类型的更新。 本期同样带给大家分享的是阿笨在实际工作中遇到真实项目场景,请跟随阿笨的视角去如何开发实现WinForm通用自动更新器AutoUpdater,如果您对本期的教程内容感兴趣,那么请允许让阿笨带着大家一起学习吧! 废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。 你学会了从1数到10吗? 三、项目实现原理图 3.1、WinForm通用自动更新器AutoUpdater原理图 实现思路:在远程IIS自动升级服务器上放一个XML文件,里面记录了软件版本号,发布日期,要更新的DLL等一些信息,如果发现本地软件的版本号和服务器上的不相等,则替换掉本地的文件。 原理图 3.2、那么我们今天需要解决涉及到的核心技术问题可以总结为下面的一句话: 如何实现通过基于HTTP协议方式进行远程IIS虚拟目录文件下载? 3.3、问:WinForm通用自动更新器AutoUpdater是以什么方式进行文件下载的呢? 支持FTP协议和HTTP两种协议方式,推荐使用HTTP方式。 四、涉及覆盖的知识点 两个独立的Winform程序之间如何传递和接收参数; 如何通过通过HTTP协议进行远程站点文件下载; IIS如何搭建自动升级虚拟站点; 如何配置IIS使其支持自定义文件后缀名格式的文件下载,比如.apk、.config、.bat、.pdb等等; AutoUpdateXmlBuilder自动升级器打包工具的使用; 等等...... 五、源代码在线演示和解读 在线观看地址:跟着阿笨一起玩NET 微信公众号地址:ABenDotNet
一、摘要 为什么取名叫《葵花宝典》? 从行走江湖的世界角度来讲您可以理解为一本"武功秘籍",站在我们IT编程的世界角度应该叫"开发宝典"。 如果您在工作中主要接触的是操作MySQL数据库,但您又想学习和了解.NET轻量级ORM框架Dapper,那么就请跟着阿笨一起学习本次的分享课《.NET轻量级ORM框架Dapper葵花宝典》。Let's Go,Do It ,Dapper For MySQL! 废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。 Dapper葵花宝典 二、课程适合人群范围 问:Dapper修炼手册和Dapper葵花宝典这两个课程我该如何选择? 答:结合自身需求,选择合适就好。 2.1《.NET轻量级ORM框架Dapper修炼手册》适合人群如下: 1、我是一个新手,主要工作面向的是MS SQL Server数据库,那么选择修炼手册一定没错。 2、对Dapper从没有过了解或者了解不全面的同学,想通过学习进一步提升对Dapper的认识。 3、迫切想提高下ADO.NET实战技术以及Transact-SQL的编写能力。 4、详细关于Dapper修炼手册可以去之前阿笨公布的公开课中查看课程介绍说明。 2.2、《.NET轻量级ORM框架Dapper葵花宝典》适合人群如下: 1、我是一个新手,主要工作面向的是MySQL数据库,那么选择葵花宝典一定没错。 2、在Dapper修炼手册的基础上新增一个Dapper扩展库Dapper.SimpleCRUD。 3、如何运用Dapper操作Mysql数据库以及Dapper如何支持多数据库。 4、学习Dapper在实际项目常用的几种开发架构模式。(简单三层架构模式、工厂模式、Repository架构模式) 5、本次新增Dapper如何操作处理事务以及优雅的方式使用事务。(强烈推荐) 三、环境准备工作 3.1、mysql for windows数据库安装。 3.2、mysql图形化管理工具介绍和使用。 3.3、mysql监控工具安装和基本使用。 3.4、SqlServer测试数据库转换为Mysql数据库。 1)、使用mss2sql工具将SqlServer转换为Mysql。 2)、Navicat for MySQL 数据导入向导功能。(强烈推荐) 备注:数据导入完成后,一定记得需要重新设置建立自增长列、索引字段以及设置字段的数据类型。 3.5、T4模板引擎基本介绍和简单使用。 四、涉及覆盖的知识点 1、.NET程序员对MySQL数据库的基本认识和理解以及使用。 2、如何通过使用.NET轻量级ORM框架Dapper操作MySQL数据库。 3、Faker.Net仿照测试数据框架运用。 4、VS单元测试NuitTest运用。 5、Dapper在异步编程(Asyn Task)中的运用。 6、原生Dapper简单的CRUD(增删改查) 葵花宝典。(强烈推荐) 7、Dapper扩展库Dapper.SimpleCRUD的基本使用。(强烈推荐) 8、Dapper如何通过DynamicParameters动态拼接查询SQL修炼手册。(强烈推荐) 9、Dapper扩展库Dapper.SqlBuilder、UniqueNamespace.SqlBuilder葵花宝典。(强烈推荐) 10、原生Dapper高级技巧葵花宝典。(强烈推荐) 11、Dapper扩展库Dapper-Extensions葵花宝典。(强烈推荐) 4.1、原生Dapper简单的CRUD(增删改查) Insert、Insert_Batch(批量插入数据)。 Update、Delete、Exist。 GetById、GetList、GetByIds(in子句使用)。 GetListReturnDynamic(返回dynamic)。 GetListByMultiQuery(返回多结果集Tuple)。 ExecuteWithDBTransaction(本地DbTransaction事务操作)。 ExecuteWithTransactionScope(分布式TransactionScope事务操作)。 4.2、Dapper扩展库Dapper.SimpleCRUD的基本使用 Insert、Delete、Exist、Insert_Batch GetById、GetList GetListPaged(获取分页数据,通过Dapper.SimpleCRUD自带的RecordCount、GetListPaged函数分别获取总记录数和分页数据。) 4.3、Dapper如何通过DynamicParameters动态拼接查询SQL修炼手册 Insert、GetListByGenreIdAndName领略DynamicParameters的风采。 SearchOrdersByPageDynamicParametersSqlBuild:获取分页数据(通过DynamicParameters动态拼接查询SQL方式拼接+ ROW_NUMBER() OVER 子句分页)。 4.4、Dapper扩展库Dapper.SqlBuilder修炼手册 通过SqlBuilder构造CRUD语句模板。 通过SqlBuilder内置的模板构造SELECT(查询)、Page(分页)语句模板。 SearchOrdersByPageDapperSqlBuilder:获取分页数据(通过Dapper.SqlBuilder拼接+ limit 子句分页)。 SearchOrdersByDapperDapperSqlBuilderSqlPagingTemplates获取分页数据(通过Dapper.SqlBuilder内置提供的分页模板进行分页)。 4.5、原生Dapper高级技巧修炼手册 CreateOrder:创建订单(采用sql拼接+for循环方式)。 GetOrderOneToManyBySqlBuilder:获取订单(一对多)通过主从表SQL语句方式。 GetOrderOneToManyByDapperQuery:获取订单(一对多)通过原生Dapper Query+splitOn关键字。 SearchOrdersByPageSqlBuild:获取分页数据(通过SQL语句拼接+ limit子句分页)。 4.6、Dapper扩展库Dapper-Extensions修炼手册 1、Insert、Insert_Batch(批量插入数据)。 2、Update、Delete、Exist。 3、GetList:包含如下知识点: *根据条件进行查询(带过滤条件和排序字段)。 *根据多组合条件进行查询(通过IPredicate的Predicates.Group()生成过滤条件+排序字段)。 *根据多组合条件进行查询(通过IPredicate.Add()生成过滤条件+排序字段)。 *根据多组合条件进行查询(通过Predicate多条件复合谓词组合生成过滤条件+排序字段,示例SQL语句:Select * From Table Where(id1=@id1 AND name2=@name2) OR (id2=@id2 AND name2=@name2)。 *根据单条件进行子查询查询(通过IPredicate.EXISTS()子查询过滤条件语句+排序字段,示例语句:Select * Form Table Where Exists(Select 1 From Table Where id=@id))。 *根据多组合条件进行子查询查询(通过IPredicate.EXISTS()子查询过滤条件语句+排序字段,示例语句:Select * From Table Where Exists(Select Count(1) From Table Where(id1=@id1 AND name2=@name2) OR (id2=@id2 AND name2=@name2)))。 *SearchOrdersByPageDapperExtensions:获取分页数据(通过提供的扩展DapperExtensions多条件组合复合谓词IPredicate+内置的Count、Page函数)。 五、Dapper葵花宝典在线学习和演示 在线观看地址:跟着阿笨一起玩NET 微信公众号:ABenDotNet 六、小结 1、在ADO.NET的世界里"手册"和"宝典"在手,畅行无阻,横行天下。 2、希望学完此本葵花宝典后,您将会汲取到满满的干货,让您更加的有底气!这样阿笨也会感到一丝丝的欣慰。 3、最后阿笨的愿景:力争通过这两次关于Dapper的分享课后,做到目前.NET方面关于Dapper最全面的教程。为.NET的崛起阿笨做一点绵薄之力吧! 4、问:怎样高效的学习《Dapper修炼手册》和《Dapper葵花宝典》? 答:阿笨给出的建议是,您下载源码后需要针对每一个测试用例进行调试和学习,这样您才能了解和熟练的使用Dapper。
一、课程介绍 直接开门见山吧,在学习之前阿笨想问大家一句,关于WebService远程过程调用技术(RPC) 你真的会了吗?不要跟老夫扯什么WebService技术已经过时,如果你的内心有在偷偷告诉你其实我是真的不会WebService的话,那么恭喜你,因为你在这茫茫的IT编程世界里找到了这本《C#远程调用技术WebService葵花宝典》!曾经有一位不知名的讲师说过这么一句名言: 一门RPC技术不会,那么千万万门RPC技术将都不会! 本次阿笨的分享课包含以下知识点。 1、C# WebService常用的几种调用方式。 2、WebService如何使用异步调用。(基于异步委托BeginInvoke/EndInvoke、基于委托事件机制、基于Async Task异步编程模式) 3、C# WebService如何保证客户端以安全的方式进行访问。 4、C#通过反射(Reflection)动态创建WebService实例。 5、微软的轻量级的IOC框架Unity的基本使用。 在此插播一条硬广告:下一堂分享课程阿笨计划将给大家带来《C#面向服务编程技术WCF从入门到实战演练》。 如果您对本次分享课感兴趣的话,那么请跟着阿笨一起学习吧。废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。 二、C# WebService两种不同引用使用方式 2.1、Web References方式引用。 2.2、Service References方式引用。 三、C# WebService如何使用异步调用 3.1、基于异步委托BeginInvoke/EndInvoke。 3.2、基于委托事件的Event机制。 3.3、基于Async Task 异步编程模型。 四、C# WebService如何保证客户端以安全的方式进行访问 4.1、先说话一下何为安全?我们需要解决什么问题? 调用安全:由于WebService是暴露在公网中,怎么防止非法用户调用我们的服务呢?因此我们需要解决:授权问题。 数据传输安全:由于我们的数据都是通过密文在网络上进行传输很容易被窃取到。因此我们需要解决:数据被窃取问题。 以上解释仅仅是阿笨狭义的理解;网络安全还包括很多方面,会话劫持、会话被篡改等等。 4.2、阿笨分享一下目前的几种常用的解决方案。 1、WebService每一个方法都需要传递一个Token固定的参数,不同的调用者各自的Token值不一样。服务端有一套规则算法生成Token值,将这个值持久化在关系数据库或者文件以及内存数据库中。 2、WebService采用asp.net的认证机制。常见的认证方式有:FORM身份验证、集成WINDOWS验证、Basic基础认证、 Digest摘要认证、 3、WebService采用SSL实现加密传输。 HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer)安全传输协议。(强烈推荐) 4、通过WebService给我们提供的SoapHeader来实现用户身份验证。(强烈推荐) 阿笨将实战环节给大家分享一种优雅的方式进行针对WebService身份验证。 5、以上几种解决方案进行组合使用。(个人推荐使用:③+④两个方案进行组合使用)(强烈推荐) 总结:我们可以通过SoapHeader来保证WebService的授权使用;可以通过SSL来保证数据的加密,防止网络侦听! 五、C# WebService如何采用SoapHeader进行身份验证 WebService身份验证 六、C# WebService如何通过优雅的方式进行统一入口调用 6.1、Unity容器方式获取WebService服务实例。 6.2、Reflect反射方式获取WebService服务实例(推荐使用)。 七、WebService葵花宝典在线学习和演示 在线观看地址:跟着阿笨一起玩NET 微信公众号:ABenDotNet
一、课程介绍 如果您从工作中之听过但未有接触过消息对队列(MQ),如果你接触过一点关于MQ的知识,如果没有这么的多如果的话......,那么阿笨将通过本次《C#消息队列零基础从入门到实战演练》分享课让您对消息队列有一个实质性的了解和认识,达到实际的灵活贯通和运用。本次分享课您将学习到以下知识点: 1、微软MSMQ的基本使用技能以及MSMQ在WCF技术中的运用。 2、企业级RabbitMQ消息队列的两种消费模式(生产消费和发布订阅)的介绍和使用。 3、如何实现RabbitMQ客户端(Client)多线路连接复用。 4、RabbitMQ服务端(Server)高可用集群的搭建。 5、RabbitMQ项目实战演练:在课程实战章节阿笨将带领大家运用RabbitMQ消息队列进行一个应用场景的项目实战分享《基于开源RabbitMQ消息中间件实现客户端系统日志实时监控》。 如果您对本次分享课感兴趣的话,那么请允许阿笨带领大家一起学习吧。 废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。 消息队列 五、消息队列MQ介绍和安装 5.1、微软MSMQ是什么? MSMQ全称是Microsoft Message Queue——微软消息队列。它是一种异步传输模式,可以在不同的应用之间实现相互通信,相互通信的应用可以分布在同一台机器上,也可以分布于相连的网络空间中的任一位置。MSMQ通过发送和接受消息使得应用程序之间的通信变的更快和更可靠。 5.2、阿笨手把手教你安装微软MSMQ 详细安装文件请参考:微软MSMQ在Windows系统安装步骤说明.pdf 5.3、RabbitMQ是什么? RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue Protocol)的开源实现。它是一个受欢迎的消息代理,通常用于应用程序之间或者程序的不同组件之间通过消息来进行集成。 5.4、阿笨手把手教你安装企业级RabbitMQ 详细安装文件请参考:RabbitMQ在Windows系统安装步骤说明.pdf 六、RabbitMQ消息队列集群服务器搭建过程演示 cluster集群示意图 七、RabbitMQ应用场景之日志处理实战演示 阿笨本次分享课将带领大家运用RabbitMQ消息队列产品进行项目实战,基于开源RabbitMQ消息中间实现客户端系统日志实时监控处理。实现核心步骤如下: 1、日志采集客户端,负责日志数据采集,定时写受写入RabbitMQ队列。 2、RabbitMQ消息队列,负责日志数据的接收,存储和转发。 3、日志处理应用:订阅并消费RabbitMQ队列中的日志数据。 7.1、RabbitMQ客户端实现客户端多连接复用(采用AMQP组来动态链接) 由于RabbitMQ是AMQP协议的实现,所以在进行远程连接的时候尽量采用amqp协议的方式连接。 var amqpList = new List { new AmqpTcpEndpoint(new Uri("amqp://192.168.0.105:5672")), new AmqpTcpEndpoint(new Uri("amqp://192.168.0.107:5672")) }; 八、源码在线解读和演示 在线观看地址:跟着阿笨一起玩NET 微信公众号:ABenDotNet
一、WCF技术我该如何学习? 阿笨的回答是:作为初学者的我们,那么请跟着阿笨一起玩WCF吧,阿笨将带领大家如何以正确的姿势去掌握WCF技术。由于WCF技术知识点太多了,就纯基础概念性知识都可以单独出一本书来讲解,本次分享课程《C#面向服务编程技术WCF从入门到实战演练》开课之前,阿笨还是希望从没了解过WCF技术的童鞋们提前先了解一下WCF技术,至少要明白WCF技术的ABC三要素分别指的是什么。要不然很难跟上阿笨的课程节奏。虽然本次课程叫WCF技术从入门到实战,但是本次课程的重点还是侧重实战环节,阿笨带来的自己对WCF技术的一些理解和认识吧,力争将WCF技术的真真干货内容分享给大家。这就是阿笨的课程与市面上最大的不同点,"理论+实战相结合"+"从实战从来到实战中去",学完后直接将学习成果运用到实际项目中去! 二、WCF技术绑定协议(Binding)那么多,那我该如何去学习? 阿笨的回答就是:"取其精华"+"抽丝剥茧",千万不要"囫囵吞枣",最终导致“因噎废食”,这里阿笨给出的建议是学习下面几种绑定: 1)、BasicHttpBinding: 最简单的绑定类型,通常用于 Web Services。使用 HTTP 协议,Text/XML 编码方式。 2)、WSHttpBinding: 比 BasicHttpBinding 更加安全。 3)、NetTcpBinding: 效率最高,安全的跨机器通讯方式。 三、C# WCF如何通过优雅的方式进行统一入口调用 采用WCF服务代理工厂(WCFServiceProxyFactory),通过服统一入口给我们的调用者提供的服务吧。 四、WCF技术我们怎么保证客户端调用的安全性? 阿笨的回答是:采用WCF的X509证书身份验证机制。 五、实战演练之C# WCF如何通过优雅的方式进行统一入口调用) WCF统一入口调用 六、实战演练之如何实现WCF混合式访问(同时支持HTTP和TCP) WCF混合式访问 七、源码在线学习和演示 在线观看地址:跟着阿笨一起玩NET 微信公众号:ABenDotNet
一、WCF课程介绍 1.1、Web Service会被WCF取代吗? 对于这个问题阿笨的回答是:两者在功能特性上却是有新旧之分,但是对于特定的系统,适合自己的就是最好的。不能哪一个技术框架和行业标准作比较,任何对于二者的比较都是错误的,因为两者根不不在同一个范畴里。就好比不能拿个汽车和交通法规比较一样,这是个误区。 阿笨的宗旨就是学完此《C#面向服务编程技术WCF从入门到实战演练》课程,让您从零基础上手后直接将学习的成果运用到实际项目中去。阿笨本次分享的WCF技术是完全来源于切身实际项目中,如何让零基础的童鞋们快速的上手和使用WCF技术!让你感觉到使用WCF技术就像WebSerice一样亲切,让WCF客户端的“调用”成为一种“享受”! WCF绝对是值得学习的一门技术,并且如果深入研究后会发现,它真的不简单! 如果您对本次分享课感兴趣的话,那么请跟着阿笨一起学习吧。废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。 二、WebService和WCF两者到底有什么区别 WebService:严格来说是行业标准,也就是WebService规范,也称作WS-*规范,既不是框架,也不是技术。它有一套完成的规范体系标准,而且在持续不断的更新完善中。它使用XML扩展标记语言来表示数据(这个是夸语言和平台的关键)。微软的Web服务实现称为ASP.NETWebService.它使用Soap简单对象访问协议来实现分布式环境里应用程序之间的数据交互。WSDL来实现服务接口相关的描述。此外Webservices可以注册到UDDI中心.供其客户查找使用。后来微软做了ASP.NETWebService的安全,性能,数据加密、解密,托管宿主等多方面的扩展,称为WSE系列,这个是过度产品,最高到WSE3.0.后来就是WCF时代。 WCF:WCF是一个分布式应用的开发框架,属于特定的技术,或者平台。既不是标准也不是规范。 WCF其实一定程度上就是ASP.NET Web Service,因为它支持WebService的行业标准和核心协议,因此ASP.NETWebService和WSE能做的事情,WCF它几乎都能胜任,跨平台和语言更不是问题(数据也支持XML格式化,而且提供了自己的格式化器)。 WCF作为微软主推一个通讯组件或者平台,它的目标不仅仅是在支持和集成WebService,因为它还兼容和具备了微软早期很多技术的特性。 五、源代码在线演示和解读 5.1、C# WCF 常用的BasicHttpBinding和WSHttpBinding两种绑定方式学习。 5.2、C# WCF如何通过优雅的方式进行统一入口调用(即WCF客户端调用采用透明代理方式)。。 5.3、C# WCF采用X509证书基本身份验证。 5.4、实战演练之如何实现WCF混合式访问(同时支持HTTP和TCP)。 客户端调用WCF服务可以通过添加服务引用的方式添加,这种方式使用起来比较简单,适合小项目使用。服务端与服务端的耦合较深,而且添加服务引用的方式生成一大堆臃肿的文件。本例探讨一种使用接口的方式使用WCF服务,克服通过服务引用方式产生的弊端。同时希望抛砖引玉,探讨更好的方式使用WCF。 WCF实战演练 WCF混合式访问 七、源码在线学习和演示 在线观看地址:跟着阿笨一起玩NET 微信公众号:ABenDotNet
GC,Garbage Collect,中文意思就是垃圾回收,指的是系统中的内存的分配和回收管理。其对系统性能的影响是不可小觑的。今天就来说一下关于GC优化的东西,这里并不着重说概念和理论,主要说一些实用的东西。关于概念和理论这里只做简单说明,具体的大家可以看微软官方文档。 一、什么是GC GC如其名,就是垃圾收集,当然这里仅就内存而言。Garbage Collector(垃圾收集器,在不至于混淆的情况下也成为GC)以应用程序的root为基础,遍历应用程序在Heap上动态分配的所有对象[2],通过识别它们是否被引用来确定哪些对象是已经死亡的、哪些仍需要被使用。已经不再被应用程序的root或者别的对象所引用的对象就是已经死亡的对象,即所谓的垃圾,需要被回收。这就是GC工作的原理。为了实现这个原理,GC有多种算法。比较常见的算法有Reference Counting,Mark Sweep,Copy Collection等等。目前主流的虚拟系统.NET CLR,Java VM和Rotor都是采用的Mark Sweep算法。(此段内容来自网络) .NET的GC机制有这样两个问题: 首先,GC并不是能释放所有的资源。它不能自动释放非托管资源。 第二,GC并不是实时性的,这将会造成系统性能上的瓶颈和不确定性。 GC并不是实时性的,这会造成系统性能上的瓶颈和不确定性。所以有了IDisposable接口,IDisposable接口定义了Dispose方法,这个方法用来供程序员显式调用以释放非托管资源。使用using语句可以简化资源管理。 二、托管资源和非托管资源 托管资源指的是.NET可以自动进行回收的资源,主要是指托管堆上分配的内存资源。托管资源的回收工作是不需要人工干预的,有.NET运行库在合适调用垃圾回收器进行回收。 非托管资源指的是.NET不知道如何回收的资源,最常见的一类非托管资源是包装操作系统资源的对象,例如文件,窗口,网络连接,数据库连接,画刷,图标等。这类资源,垃圾回收器在清理的时候会调用Object.Finalize()方法。默认情况下,方法是空的,对于非托管对象,需要在此方法中编写回收非托管资源的代码,以便垃圾回收器正确回收资源。 在.NET中,Object.Finalize()方法是无法重载的,编译器是根据类的析构函数来自动生成Object.Finalize()方法的,所以对于包含非托管资源的类,可以将释放非托管资源的代码放在析构函数。 三、关于GC优化的一个例子 正常情况下,我们是不需要去管GC这些东西的,然而GC并不是实时性的,所以我们的资源使用完后,GC什么时候回收也是不确定的,所以会带来一些诸如内存泄漏、内存不足的情况,比如我们处理一个约500M的大文件,用完后GC不会立刻执行清理来释放内存,因为GC不知道我们是否还会使用,所以它就等待,先去处理其他的东西,过一段时间后,发现这些东西不再用了,才执行清理,释放内存。 下面,来介绍一下GC中用到的几个函数: GC.SuppressFinalize(this); //请求公共语言运行时不要调用指定对象的终结器。 GC.GetTotalMemory(false); //检索当前认为要分配的字节数。 一个参数,指示此方法是否可以等待较短间隔再返回,以便系统回收垃圾和终结对象。 GC.Collect(); //强制对所有代进行即时垃圾回收。 GC运行机制 写代码前,我们先来说一下GC的运行机制。大家都知道GC是一个后台线程,他会周期性的查找对象,然后调用Finalize()方法去消耗他,我们继承IDispose接口,调用Dispose方法,销毁了对象,而GC并不知道。GC依然会调用Finalize()方法,而在.NET 中Object.Finalize()方法是无法重载的,所以我们可以使用析构函数来阻止重复的释放。我们调用完Dispose方法后,还有调用GC.SuppressFinalize(this) 方法来告诉GC,不需要在调用这些对象的Finalize()方法了。 下面,我们新建一个控制台程序,加一个Factory类,让他继承自IDispose接口,代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace GarbageCollect { public class Factory : IDisposable { private StringBuilder sb = new StringBuilder(); List<int> list = new List<int>(); //拼接字符串,创造一些内存垃圾 public void MakeSomeGarbage() { for (int i = 0; i < 50000; i++) { sb.Append(i.ToString()); } } //销毁类时,会调用析构函数 ~Factory() { Dispose(false); } public void Dispose() { Dispose(true); } protected virtual void Dispose(bool disposing) { if (!disposing) { return; } sb = null; GC.Collect(); GC.SuppressFinalize(this); } } } 只有继承自IDispose接口,使用这个类时才能使用Using语句,在main方法中写如下代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; namespace GarbageCollect { class Program { static void Main(string[] args) { using(Factory f = new Factory()) { f.MakeSomeGarbage(); Console.WriteLine("Total memory is {0} KBs.", GC.GetTotalMemory(false) / 1024); } Console.WriteLine("After GC total memory is {0} KBs.", GC.GetTotalMemory(false) / 1024); Console.Read(); } } } 运行结果如下,可以看到资源运行MakeSomeGarbage()函数后的内存占用为1796KB,释放后成了83Kb. 代码运行机制: 我们写了Dispose方法,还写了析构函数,那么他们分别什么时候被调用呢?我们分别在两个方法上面下断点。调试运行,你会发现先走到了Dispose方法上面,知道程序运行完也没走析构函数,那是因为我们调用了GC.SuppressFinalize(this)方法,如果去掉这个方法后,你会发现先走Dispose方法,后面又走析构函数。所以,我们可以得知,如果我们调用Dispose方法,GC就会调用析构函数去销毁对象,从而释放资源。 四、什么时候该调用GC.Collect 这里为了让大家看到效果,我显示调用的GC.Collect()方法,让GC立刻释放内存,但是频繁的调用GC.Collect()方法会降低程序的性能,除非我们程序中某些操作占用了大量内存需要马上释放,才可以显示调用。下面是官方文档中的说明: 垃圾回收 GC 类提供 GC.Collect 方法,您可以使用该方法让应用程序在一定程度上直接控制垃圾回收器。通常情况下,您应该避免调用任何回收方法,让垃圾回收器独立运行。在大多数情况下,垃圾回收器在确定执行回收的最佳时机方面更有优势。但是,在某些不常发生的情况下,强制回收可以提高应用程序的性能。当应用程序代码中某个确定的点上使用的内存量大量减少时,在这种情况下使用 GC.Collect 方法可能比较合适。例如,应用程序可能使用引用大量非托管资源的文档。当您的应用程序关闭该文档时,您完全知道已经不再需要文档曾使用的资源了。出于性能的原因,一次全部释放这些资源很有意义。有关更多信息,请参见 GC.Collect 方法。 在垃圾回收器执行回收之前,它会挂起当前正在执行的所有线程。如果不必要地多次调用 GC.Collect,这可能会造成性能问题。您还应该注意不要将调用GC.Collect 的代码放置在程序中用户可以经常调用的点上。这可能会削弱垃圾回收器中优化引擎的作用,而垃圾回收器可以确定运行垃圾回收的最佳时间。 参考资料:http://stackoverflow.com/questions/538060/proper-use-of-the-idisposable-interface 作者:阿笨 官方QQ群:422315558 个人讲师课堂主页:http://study.163.com/instructor/2544628.htm 个人微信公众号课程主页:http://dwz.cn/ABenNET
一、多线程技术应用场景介绍 本期同样带给大家分享的是阿笨在实际工作中遇到的真实业务场景,请跟随阿笨的视角去如何采用基于开源组件SmartThreadPool线程池技术实现多任务批量处理。在工作中您是否遇到过如何快速高效的处理Job任务列表、如何通过多线程批量处理订单、如何多线程群发短信、如何批量上传图片到远程图片服务器或者云存储图片服务器、如何通过多线程让应用程序提高对CPU的利用率从而增加应用程序的处理效率,等等。如果您有遇到类似的业务场景的而感到烦恼的话,那么今天您看完阿笨的分享课后下次碰到这类疑难杂症的问题一定不再困惑,思绪一下子会豁然开朗。如果您对本期的教程内容感兴趣,那么大家跟着阿笨一起学习吧! 废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。 三、线程池处理多任务原理图 原理图 四、涉及覆盖的知识点 4.1、WinForm桌面应用程序开发小技术和技能。如下: 1、比如System.Threading.Timer定时器在实际项目中的大量灵活运行。 2、如何快速的通过阿笨提供的控件库实现桌面应用程序的UI美化和人性化布局。 3、C#中使用Settings.settings来存储用户自定义配置文件。 4、C#如何快速的创建Windows服务应用程序。 5、C#如何支持批处理文件(bat)以及如何通过批处理指令连接远程服务器建立本地映射盘。 等等...... 4.2、阿笨本次分享课将给大家带来在实际项目中的三种技术解决办案如何采用多线程技术来实现多任务的批量处理。以后碰到这样的通用的业务场景时,你会感觉到“手到擒来,得心应手”。如下: 1、如何使用SmartThreadPool线程池技术实现多任务的批量处理。(强烈推荐) 2、如何使用.NET默认自带的ThreadPool线程池技术实现多任务的批量处理。 3、如何使用.NET 4.5异步编程Task技术实现多任务的批量处理。 4.3、第三方开源组件的基本使用 1、日志框架,Nlog和Log4net。 2、序列化组件json.net。 2、如何使用开源Topshelf组件创建Windows服务。 五、SmartThreadPool基本使用 5.1、github源码地址: https://github.com/amibar/SmartThreadPool 5.2、NuGet进行在线下载: Install-Package SmartThreadPool.dll 5.3、演示SmartThreadPool如何实现等待多个Job任务执行完成 六、源代码在线演示和解读 在线观看地址:跟着阿笨一起玩NET 微信公众号:ABenDotNet
一、摘要 1.1、为什么叫本次的分享课叫《修炼手册》? 阿笨希望本次的分享课中涉及覆盖的一些小技巧、小技能给您带来一些帮助。希望您在日后工作中把它作为一本实际技能手册进行储备,以备不时之需,一旦当手头遇到与Dapper修炼手册中相似用法的地方和场景,可以直接拿来进行翻阅并灵活的运用到项目中。最后阿笨建议您可以根据自己在工作中碰到的不同的使用场景,不断的完善此本修炼手册。 废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。 四、涉及覆盖的知识点 1、C# Linq To Xml技术。 2、Transact-SQL修炼手册。比如如何使用临时表、创建用户自定义表(TABLE)、XML数据字段、ROW_NUMBER分页函数、存储过程修炼手册(动态执行SQL、异常处理机制、事务处理机制)、C#如何获取存储过程的OUTPUT、RETURN参数值。 3、SQL Sever FOR XML技术(XML PATH、XML RAW、XML AUTO简单用法介绍)。 4、Transact-SQL关键字OPENXML操作内存中的 XML 文档。 5、Faker.Net仿照测试数据框架运用。 6、VS单元测试NuitTest运用。 7、Dapper在异步编程(Asyn Task)中的运用。 8、原生Dapper简单的CRUD(增删改查) 修炼手册。(强烈推荐) 9、Dapper如何通过DynamicParameters动态拼接查询SQL修炼手册。(强烈推荐) 10、Dapper扩展库Dapper.SqlBuilder、UniqueNamespace.SqlBuilder修炼手册。(强烈推荐) 11、原生Dapper高级技巧修炼手册。(强烈推荐) 12、Dapper扩展库Dapper-Extensions修炼手册。(强烈推荐) 五、Dapper修炼手册在线学习和演示 5.1、原生Dapper简单的CRUD(增删改查) 修炼手册 Insert、Insert_Batch(批量插入数据)。 Update、Delete、Exist。 GetById、GetList、GetByIds(in子句使用)。 GetListReturnDynamic(返回dynamic)。 GetListByMultiQuery(返回多结果集Tuple)。 ExecuteWithDBTransaction(本地DbTransaction事务操作)。 ExecuteWithTransactionScope(分布式TransactionScope事务操作)。 5.2、Dapper如何通过DynamicParameters动态拼接查询SQL修炼手册 Insert、GetListByGenreIdAndName领略DynamicParameters的风采。 SearchOrdersByPageDynamicParametersSqlBuild:获取分页数据(通过DynamicParameters动态拼接查询SQL方式拼接+ ROW_NUMBER() OVER 子句分页)。 SearchOrdersByDynamicParametersOutPutANDReturnVaule:如何使用DynamicParameters构造和获取存储过程OUTPUT、RETURN参数值,以及获取存储过程返回一个或多个结果集。 5.3、Dapper扩展库Dapper.SqlBuilder修炼手册 通过SqlBuilder构造CRUD语句模板。 通过SqlBuilder内置的模板构造SELECT(查询)、Page(分页)语句模板。 GetOrderOneToManyByDapperSqlBuilder:获取订单"一对多"通过SQL语法 XML PATH子句。 SearchOrdersByPageDapperSqlBuilder:获取分页数据(通过Dapper.SqlBuilder拼接+ ROW_NUMBER() OVER 子句分页)。 SearchOrdersByDapperDapperSqlBuilderSqlPagingTemplates获取分页数据(通过Dapper.SqlBuilder内置提供的分页模板进行分页)。 5.4、原生Dapper高级技巧修炼手册 CreateOrder:创建订单(采用sql拼接+for循环方式)。 CreateOrderByStoredProcedures_XMLPath:创建订单(采用生成XML+SQL XML数据类型的XMLPath方式)。 CreateOrderByStoredProcedures_OpenXml:创建订单(采用生成XML+SQL XML数据类型的OpenXml方式)。 CreateOrderByStoredProcedures_CustomTableType:创建订单(采用SQL用户创建自定义表类型)。 GetOrderOneToManyBySqlBuilder:获取订单(一对多)通过主从表SQL语句方式。 GetOrderOneToManyByDapperQuery:获取订单(一对多)通过原生Dapper Query+splitOn关键字。 SearchOrdersByPageSqlBuild:获取分页数据(通过SQL语句拼接+ ROW_NUMBER() OVER 子句分页)。 SearchOrdersByPageSqlStoredProcedures:获取分页数据(通过SQL分页存储过程+ ROW_NUMBER() OVER 子句分页)。 5.5、Dapper扩展库Dapper-Extensions修炼手册 1、Insert、Insert_Batch(批量插入数据)。 2、Update、Delete、Exist。 3、Insert_BatchBySqlBulkCopy(基于SqlBulkCopy方法进行批量插入数据)。 4、GetList:包含如下知识点: *根据条件进行查询(带过滤条件和排序字段)。 *根据多组合条件进行查询(通过IPredicate的Predicates.Group()生成过滤条件+排序字段)。 *根据多组合条件进行查询(通过IPredicate.Add()生成过滤条件+排序字段)。 *根据多组合条件进行查询(通过Predicate多条件复合谓词组合生成过滤条件+排序字段,示例SQL语句:Select * From Table Where(id1=@id1 AND name2=@name2) OR (id2=@id2 AND name2=@name2)。 *根据单条件进行子查询查询(通过IPredicate.EXISTS()子查询过滤条件语句+排序字段,示例语句:Select * Form Table Where Exists(Select 1 From Table Where id=@id))。 *根据多组合条件进行子查询查询(通过IPredicate.EXISTS()子查询过滤条件语句+排序字段,示例语句:Select * From Table Where Exists(Select Count(1) From Table Where(id1=@id1 AND name2=@name2) OR (id2=@id2 AND name2=@name2)))。 *SearchOrdersByPageDapperExtensions:获取分页数据(通过提供的扩展DapperExtensions多条件组合复合谓词IPredicate+内置的Count、Page函数)。 五、源代码在线演示和解读 在线观看地址:跟着阿笨一起玩NET 微信公众号:ABenDotNet 六、小结 在ADO.NET的世界里“海阔凭鱼跃,天高任鸟飞”。 Transact-SQL编程能力再上一个台阶。 领略到了Dapper她的“美”! 学完此本修炼手册后,您将会汲取到满满的干货,让您更加的有底气! 后续计划:阿笨将后续计划给大家带来另外一堂分享课《.NET轻量级ORM组件Dapper实战宝典》,大概包含Dapper For MSQL,Dapper For Mysql、Dapper For Oracle、数据访问层之Repository模式以及基于Dapper开源的仓储模式项目运用,等等。
摘要 本期带给大家分享的是阿笨在实际工作中遇到的真实业务场景,请跟随阿笨的视角去如何一步步解决WEB网页快速批量打印,如果您对本期的教程内容感兴趣,那么请允许让阿笨带着大家一起学习吧! 废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。 你准备好了吗,老夫要开始撸了 一、需求背景介绍 大概是2年以前工作中碰到的一个实际项目,在仓储物流系统中,打印是一个很频繁的操作环节,仓库每天经常需要大批量的在WEB网页上打印功能。比如内部HTML标签、邮递标签(10x10,10x16.5,10x20)、发货清单(A5)以及电池信和发票(A4)以及物流商返回的PDF格式的邮递标签文件,所以打印环节的快慢直接影响仓库操作人员的操作便捷性和仓库的发货效率。 1.1、大家都知道WEB网页上打印的过程: 一般分为:1、扫描包裹条形码后点击打印按钮=>2、在线弹出打印对话框=>3、选择对应的打印这三个步骤。 如果同时打印知识,假如一次性批量打印不同种类的SKU产品条码这种方式极大的繁琐给客户带来不友好的体验。 因此我们当时考虑将WEB网页打印方式能不能调整为桌面客户端打印实现,但是为了更好的与现有WEB网页业务系统集成,故又不想重新独立开发出一套客户端打印系统,那么我们能不能开发出一套打印组件,完全与业务逻辑分离只接管打印工作呢? 答案是:肯定OK! 1.2、WEB网页和WinForm桌面客户端打印的优缺点 WEB网页打印方式存在的缺陷: 1)、大批量打印SKU产品条码,会经常出现走纸偏移的问题,需要经常人工校验打印走纸; 2)、不能同时一次性打印不同规格的纸张,只能单个规格类型的进行打印; 等等。。。 WinForm桌面客户端打印优势: 1)、可以动态的切换本地默认打印机,实现根据配置文件自动匹配打印机无需人工选择,直接将打印默认文件发送指定的打印机; 2)、无需像浏览器一样安装单独PDF在线浏览插件,C#有程序的组件专门针对PDF文件格式打印; 等等。。。 1.3、那么我们今天要解决的问题可以总结为下面的一句话: 如何让WEB网页端和桌面客户端进行交互通讯? 二、实现原理图 草稿图 原理图 三、涉及覆盖的知识点 .NET WebService基本使用技巧; WinForm中如何使用WebBroswer浏览器控件进行HTML页面的打印; TCP/IP通讯组件SuperSocket实现服务端向指定的客户端推送(push)消息; 服务端crash或者重启后客户端如何实现自动断线重连; 如何防止IIS自动回收应用程序进程; Redis消息队列存储用户离线数据实现消息的持久化; 四、源代码在线演示和解读 在线观看地址:跟着阿笨一起玩NET 微信公众号:ABenDotNet
一、FastSocket课程介绍 .NET框架虽然微软提供了socket通信的类库,但是还有很多事情要自己处理,比如TCP协议需要处理分包、组包、粘包、维护连接列表等,UDP协议需要处理丢包、乱序,而且对于多连接并发,还要自己处理多线程等等。本期分享课程阿笨给大家带来的是来源于github开源Socket通信中间件:FastSocket,目的就是把大家从繁琐的网络编程技术中彻底地解放和释放出来。 阿笨只想安安静静的学习下网络编程技术Socket后,将学习的成果直接灵活的运用到自己的实际项目中去。一切只讲概念知识不结合实战演练的课程,都是耍流氓!那么这一次分享课阿笨就不讲概念知识,只注重实战演练。别跟程序猿说什么网络编程IOCP模型,程序猿拿起键盘就是三个字:"敲代码"! 本期课程阿笨给大家带来两个基于FastSocket通讯组件的实战项目演示实例: 1、基于FastSocket开发的客户端和服务端聊天应用程序(ABenNET.FastSocket.AppChat)。 2、基于FastSocket开发的在线客户端监控应用程序(ABenNET.FastSocket.AppMonitor)。 如果您对本期的《C#网络编程技术FastSocket实战项目演练》课程感兴趣的话,那么请跟着阿笨一起学习吧!废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。 二、FastSocket介绍和实战项目截图 2.1、什么是FastSocket? 当阿笨第一次发现FastSocekt这个开源的通讯框架的时候,就被它深深的吸引住了。它的优雅的写法和简单的使用是阿笨最看重的;FastSocket将网络编程抽象化了,让开发人员不用去关心底层通讯机制,而只关注应用层面的开发工作。 2.2、FastSocket优点 1)、自带心跳检查功能。 2)、自带断线重连功能。 3)、支持灵活的自定义通讯协议和通讯指令(FastSocket内置了命令行、二进制、thrift协议)。 等等...... 2.3、FastSocket在线下载地址: https://github.com/ihaoqihao/FastSocket.Net 2.4、实战项目演练课程截图AppChat、AppMonitor实战项目 课程详细的实例截图以及AppChat、AppMonitor演示示例应用程序,阿笨免费的提供给大家在线观看和下载。 注意:需要安装.NET FreamWork 4.5 框架 百度网盘在线下载地址:(注意区分大写哦) 链接:http://pan.baidu.com/s/1skU0alv 密码:znb5 AppChat实战项目 AppMonitor实战项目 三、AppChat实战演练源代码在线演示和解读 AppChat实战演练源代码 四、AppMonitor实战演练源代码在线演示和解读 AppMonitor实战演练源代码 五、小结 下一次分享阿笨计划给大家带来另外一堂课程《C#网络编程技术SuperSocket实战项目演练》!如果您对SuperSocket这款高性能的开源通讯组件感兴趣的话,那到时候请跟着阿笨一起学习吧。 阿笨希望带来的自己对Scoket网络编程技术的一些理解和认识吧,力争将Socket技术的真真干货内容分享给大家。这就是阿笨的课程与市面上最大的不同点,"理论+实战相结合"+"从实战从来到实战中去",学完后直接将学习成果运用到实际项目中去! 六、《C#网络编程技术FastSocket实战项目演练》在线观看 在线观看地址:跟着阿笨一起玩NET 微信公众号:ABenDotNet
一、SuperSocket课程介绍 1.1、本期《C#网络编程技术SuperSocket实战项目演练》课程阿笨给大家带来三个基于SuperSocket通讯组件的实战项目演示实例: ● 基于SuperSocket开发的客户端和服务端聊天应用程序(ABenNET.SuperSocket.AppChat)。 ● 基于SuperWebSocket开发的客户端和服务端聊天应用程序(ABenNET.SuperWebSocket.AppChat)。 ● 基于SuperWebSocket开发的网页端和服务端聊天应用程序(ABenNET.SuperWebSocket.WebChat) 1.2、SuperSocket课程涉及覆盖的知识点 1.2.1、SuperSocket如何实现完善健康检查机制 1)、如何实现客户端和服务端保持心跳检查功能(HeartBeat;)。 2)、如何实现客户端与服务端断线重连功能(ReConnection)。 1.2.2、SuperSocket服务器几种配置方式介绍 1)、通过编码方式实现SuperSocket服务端配置。 2)、通过独立的Config配置文件方式实现SuperSocket服务端配置。 1.2.3、SuperSocket常见的几种宿主方式介绍 1)、控制台应用程序(Console)、WinForm、IIS等方式进行Socket服务端宿主。 2)、采用SuperSocket.SocketService.exe工具实现Windows服务方式进行Socket服务宿主。 1.2.4、SuperSocket和SuperWebSocket组件客户端SDK和服务端SDK的常用使用介绍。 1)、EasyClient、CustomTerminatorReceiveFilter、CustomAppServer、CustomAppSession、CustomCommand 2)、CustomWebSocketServer、CustomWebSocketSession、WebSocket 如果您对本期的课程感兴趣的话,那么请跟着阿笨一起学习吧! 废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。 二、SuperSocket介绍和实战项目截图 WebSocket截图一 WebSocket截图二 SuperSocket客户端和服务端通讯截图 三、SuperSocket概念名称含义解释 3.1、SuperSocket是如何神圣? 官网解释:SuperSocket 是一个轻量级, 跨平台而且可扩展的 .Net/Mono Socket 服务器程序框架。你无须了解如何使用 Socket, 如何维护 Socket 连接和 Socket 如何工作,但是你却可以使用 SuperSocket 很容易的开发出一款 Socket 服务器端软件,例如游戏服务器,GPS 服务器, 工业控制服务和数据采集服务器等等。 阿笨理解:SuperSocket 是一个开源轻量级跨平台而且可扩展的.NET高性能通讯中间件。 3.2、什么是Socket? Socket的英文原义是“孔”或“插座”。网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。 3.3、什么是SuperSocket? SuperSocket(简称SS)是一个轻量级的可扩展的 Socket 开发框架,可用来构建一个服务器端 Socket 程序,而无需了解如何使用 Socket,如何维护Socket连接,Socket是如何工作的。该项目使用纯 C# 开发,易于扩展和集成到已有的项目。只要你的已有系统是使用.NET开发的,你都能够使用 SuperSocket来轻易的开发出你需要的Socket应用程序来集成到你的现有系统之中。 3.4、什么是WebSocket? WebSocket 协议本质上是一个基于 TCP 的协议。为了建立一个 WebSocket 连接,客户端浏览器首先要向服务器发起一个 HTTP 请求,这个请求和通常的 HTTP 请求不同,包含了一些附加头信息,其中附加头信息”Upgrade: WebSocket”表明这是一个申请协议升级的 HTTP 请求,服务器端解析这些附加的头信息然后产生应答信息返回给客户端,客户端和服务器端的 WebSocket 连接就建立起来了,双方就可以通过这个连接通道自由的传递信息,并且这个连接会持续存在直到客户端或者服务器端的某一方主动的关闭连接。 3.5、为什么会有WebSocket? WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,由于HTTP是不支持持久连接的基于现有的HTTP之上的一些技术(如长轮询Polling、Comet)并满足不了这种持久连接(TCPConnection)需求,有必要定义一个全新的协议。 3.6、什么是SuperWebSocket? SuperWebSocket是基于.NET开源Socket框架SuperSocket开发的, SuperSocket所支持的大部分功能在SuperWebSocket中得到了继承。用户可通过SuperWebSocket来快速的构建可靠的,高性能的websocket服务器端应用程序。和SuperSocket一样,SuperWebSocket可以控制台和windows服务的形式运行,同时它还支持直接运行在Website之内,这样更简化了用户的部署。 下面是主流浏览器对 HTML5 WebSocket 的支持情况: WebSocket浏览器支持情况 3.7、Socket和WebSocket两者有什么区别和联系? 两者区别:WebSocket是HTML5下一种新的协议。它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的。它与HTTP一样通过已建立的TCP连接来传输数据,但是它和HTTP最大不同是: 1)、WebSocket是一种双向通信协议。在建立连接后,WebSocket服务器端和客户端都能主动向对方发送或接收数据,就像Socket一样; 2)、WebSocket需要像TCP一样,先建立连接,连接成功后才能相互通信。 两者联系:可以把WebSocket想象成HTTP,HTTP和Socket什么关系,WebSocket和Socket就是什么关系。 四、SuperSocket安装手册 为什么要单独出一节关于supersocket的安装手册?由于supersocket经历了很多的版本的迭代,作为初学者的童鞋可能按照官方文档使用的过程中难免出现程序集引用出现混乱的情况。特别阿笨明白大家的痛点,故特别给大家总结了一下使用supersocket过程中需要注意的事项。 关于supersocket组件nuget主页下载地址 https://www.nuget.org/profiles/kerryjiang 大家千万别下错了。 一、SuperSocket 1)、SuperSocket 服务端(Server) github下载地址:https://github.com/kerryjiang/SuperSocket nuget下载地址:https://www.nuget.org/packages/SuperSocket/ SuperSocket.Engine 服务引擎 (必须安装) nuget下载地址:https://www.nuget.org/packages/SuperSocket.Engine/ 2)、SuperSocket.ClientEngine 客户端(Client) gitbub下载地址:https://github.com/kerryjiang/SuperSocket.ClientEngine nuget下载地址:https://www.nuget.org/packages/SuperSocket.ClientEngine/ 特别说明:关于客户端client engine版本0.7.0.1以后的版本就不再是使用AsyncTcpSession对象而是使用EasyClient对象Install-Package SuperSocket.ClientEngine.Core -Version 0.7.0.1 ,而在0.7.0.1版本中既使用了EasyClient也使用了AsyncTcpSession。不知道为什么新的版本作者把它给阉割了。有谁可以回答一下我的这个问题吗? 二、SuperWebSocket SuperSocket通讯组件支持WebSocket协议。 1)、SuperSocket.WebSocket 服务端(Server) nuget下载地址:https://www.nuget.org/packages/SuperSocket.WebSocket/ 千万不要再使用SuperWebSocket这个老的版本了,现在已经独立出来啦。 SuperWebSocket nuget下载地址:https://www.nuget.org/packages/SuperWebSocket/ 2)、WebSocket4Net客户端(Client) github下载地址:https://github.com/kerryjiang/WebSocket4Net nuget下载地址:https://www.nuget.org/packages/WebSocket4Net/ SuperSocket.ClientEngine客户端引擎 (必须安装) 3)、 WebSocket 客户端的 JavaScript API ● HTML5定义的WebSocket ● Socket.io ● sockjs 五、ABenNET.SuperSocket.AppChat实战演练源代码在线演示和解读 ● 基于SuperSocekt实现客户端和服务端通信 六、ABenNET.SuperWebSocket.AppChat实战演练源代码在线演示和解读 ● 基于SuperWebSocekt实现客户端和服务端通信 七、ABenNET.SuperWebSocket.WebChat实战演练源代码在线演示和解读 ● 基于SuperWebSocekt实现WEB网页端和服务端通信 八、小结(Q&A) ● 我们到底选择哪一款开源的Socket框架?(详细文章介绍可以关注跟着阿笨一起玩NET×××公众号ABentDotNet) 1、这个需要大家结合自身的项目场景来决定了;如果您的项目场景不复杂,只需要实现客户端和服务端进行通信但又想上手简单的话,那么推荐使用FS;如果您的项目应用场景比较复杂,比如需要自定义通讯协议,需要支持WebSocket、多服务器实例托管,部署灵活性等等一些高级复杂的功能,那么推荐使用SS。 2、两款Socket框架作为NET学习网络编程技术都是值得推荐学习的。 ● 阿笨希望带来的自己对Scoket网络编程技术的一些理解和认识吧,力争将Socket技术的真真干货内容分享给大家。这就是阿笨的课程与市面上最大的不同点,"理论+实战相结合"+"从实战从来到实战中去",学完后直接将学习成果运用到实际项目中去! 九、《C#网络编程技术SuperSocket实战项目演练》在线观看 在线观看地址:跟着阿笨一起玩NET 微信公众号:ABenDotNet
一、摘要 FastSocket(简称:FS)突出:简单灵活、上手容易。 SuperSocket(简称:SS)突出:功能丰富、扩展强大。 二、FS和SS摆在我们的面前,那么我们应该选择哪一个玩呀? 2.1、什么是FastSocket? 1)、FS是一个轻量级易扩展的c#异步socket通信库,项目开始于2011年,经过近3年不断调整与改进,目前在功能和性能上均有不错的表现。 2)、FS非常不错,先不说性能如何,单说它的使用方式和理念上就很让人赞口,从宏观上看,它更像是一种远程过程的调用RPC,即服务器公开一些命令,供客户端去调用,很灵活,而它的理念上来说,它将socket编程抽象化了,让开发人员不用去关心底层通讯机制,而只关心应用层的开发,如开发一个用户模块,你不用关心socket链接怎么声明,不用关心性能,你只要开发和用户相关的内容即可。 2)、FS内置了命令行、二进制、thrift协议,基于此开发了Zookeeper, Redis, Thrift等c#异步客户端,接下来将会一一公开。(作者说了接来下了会一一公开) 2.2、什么是SuperSocket? 1)、SS是一个轻量级的可扩展的 Socket 开发框架,可用来构建一个服务器端 Socket 程序,而无需了解如何使用 Socket,如何维护Socket连接,Socket是如何工作的。该项目使用纯 C# 开发,易于扩展和集成到已有的项目。只要你的已有系统是使用.NET开发的,你都能够使用 SuperSocket来轻易的开发出你需要的Socket应用程序来集成到你的现有系统之中。 2)、SS是一个轻量级, 跨平台而且可扩展的 .Net/Mono Socket 服务器程序框架。你无须了解如何使用 Socket, 如何维护 Socket 连接和 Socket 如何工作,但是你却可以使用 SuperSocket 很容易的开发出一款 Socket 服务器端软件,例如游戏服务器,GPS 服务器, 工业控制服务和数据采集服务器等等。 3)、SS通讯组件支持WebSocket协议。(亮点功能) 阿笨理解:SS是一个开源轻量级跨平台而且可扩展的.NET高性能通讯中间件。 三、阿笨最后给出的建议 1、这个需要大家结合自身的项目场景来决定了;如果您的项目场景不复杂,只需要实现客户端和服务端进行通信但又想上手简单的话,那么推荐使用FS;如果您的项目应用场景比较复杂,比如需要自定义通讯协议,需要支持WebSocket、多服务器实例托管,部署灵活性等等一些高级复杂的功能,那么推荐使用SS。 2、两款Socket框架作为NET学习网络编程技术都是值得推荐学习的。 四、《C#网络编程技术FastSocket实战项目演练》在线观看 在线观看地址:跟着阿笨一起玩NET 微信公众号:ABenDotNet 五、《C#网络编程技术SuperSocket实战项目演练》在线观看 在线观看地址:跟着阿笨一起玩NET 微信公众号:ABenDotNet