标签 [C#]

16
Windows Forms Invoke() 泄露句柄原因之调查
有朋友问我关于 微软开源 WinForms, WPF 和 WinUI 的看法。说实话,我没什么看法。开源这个事,从来都是有兴趣的人才会 Awesome,对吃瓜群众只能是 So what。不过这则消息让我想起大概半年前维护产品客户端时遇到的一个问题,当时没有机会深入分析,现在既然 WinForm 已经开源,倒是值得深入分析一下了。
JetBrains Rider 介绍
概述 在 JetBrains 的产品大家族中,Rider 算是比较年轻的一款, 网络上的资料也比较少。不过,考虑到 Rider 主体程序的两大组成部分(IntelliJ Platform 和 Resharper Backend) 都已经发展了很多年,那么 Rider 也不能简单地看作一个新生儿了。如果你比较关注 JetBrains 官方信息的话,那么会发现最近一段时间 Rider 和其他产品相比出现的频率相当高,可见这个产品很受重视,开发也非常活跃。
用 C# 自己动手编写一个 Web 服务器,第六部分——用户验证
用户验证和授权 在 上一篇文章中,我们添加了视图引擎支持,可以输出真正的动态页面了。再加上控制器(Controller)的支持,现在应用程序开发者可以自由执行业务逻辑,并输出想要的页面效果,可以说,一个真正的 Web 服务器已经基本成型了。不过,大多数业务系统还需要用户验证(Authentication)和授权(Authorization)的功能,允许用户在系统中登录和注销,并根据用户权限判断他(她)能够执行的操作。
用 C# 自己动手编写一个 Web 服务器,第四部分——Session
Session 在 上一篇文章 中,我们实现了 Web 服务器的路由功能,并实现了控制器的基本支持。本来,我们应该高高兴兴的继续向其中添加功能,不过马上就发现一个尴尬的问题————我们还没有 Session。更具体的说,我们一直在使用的 HttpListenerContext 只提供了 Request/Response,却没有 Session 属性。这意味着我们的服务器毫无记性,只能把每次请求都当作新的用户。
用 C# 自己动手编写一个 Web 服务器,第五部分——视图引擎
视图引擎 在 上一篇文章 中,我们实现了 Session,并在过程中为 HttpListenerContext 提供了更高层的封装。在 Controller 返回的结果中我们可以看到服务器动态执行的结果,不过目前它们是以原始字符串的形式存在的。从基本原理来说,返回字符串并没有什么不妥————互联网早期的 CGI/Servlet 都是这么做的。问题在于这种接口过于底层了。设计者希望看到 HTML 页面,而不是苦哈哈的自己去拼接字符串。这就是视图引擎(View Engine)存在的理由。
用 C# 自己动手编写一个 Web 服务器,第二部分——中间件
在 上一篇文章 我们创建了一个具有基本静态文件服务功能的 Web 服务器,但是还没有动态功能的支持。我们希望在这个程序的基础上进一步扩充,成为具有完整功能的动态 Web 服务器。不过先别忙着写代码,让我们从架构的层次上考虑一下 Web 框架应该是什么样的。
用 C# 自己动手编写一个 Web 服务器,第三部分——路由
路由(Routing) 在 上一篇文章 中,我们将 Web 服务器的功能拆分成一系列较小的中间件(Middleware),建立起一个灵活、可扩展的架构。但目前的中间件只提供了静态文件支持,还没有任何动态功能。 对于绝大多数现代 Web 服务器来说,路由(Routing)都是其中核心的部分。按照企业应用架构模式的分类,路由应该属于其中的“前端控制器”(Front controller),主要目的是将接收到的 HTTP 请求分发到相应的后端业务模块去处理。而分发规则主要是基于请求的信息(路径、HTTP方法、头部信息、Cookie等)。虽然总体思路是相似的,但各个语言或编程框架声明路由的方式还是相差很大。例如,Nodejs 框架 Express 要求你显式声明路由对应的方法:
用 C# 自己动手编写一个 Web 服务器,第一部分——基础
市场上已经有如此之多的 Web 服务器,为什么还要自己写一个?这对真正的黑客来说其实是个无需回答的问题。不过,即便你自认是个小白,也无需被题目吓倒——现代的语言和框架已经为我们提供了非常强大的基础设施,我们用很少的代码就能搭建起一个基础的 Web 服务器。事实上,我们下面要介绍的第一版程序核心代码经过完整的封装、并且提供了静态文件处理,而核心代码也不过 70 行左右,如果你只想要一个静态文件服务器,那么你完全可以把代码压缩到 40 行,而且这些代码非常容易理解。
用 C# 自己动手编写一个 Web 服务器 (索引)
这里是本系列文章的索引。 用 C# 自己动手编写一个 Web 服务器 (索引) 用 C# 自己动手编写一个 Web 服务器,第一部分——基础 用 C# 自己动手编写一个 Web 服务器,第二部分——中间件 用 C# 自己动手编写一个 Web 服务器,第三部分——路由 用 C# 自己动手编写一个 Web 服务器,第四部分——Session 用 C# 自己动手编写一个 Web 服务器,第五部分——视图引擎 用 C# 自己动手编写一个 Web 服务器,第六部分——用户验证
吐槽: 微信支付的 SDK(.Net) 可能是实习生写的
最近在作一个接入支付的项目,支付类型包括支付宝和微信支付。我是一个懒人,写代码的原则是:只要官方有 SDK 可用的话就尽量用官方的,除非万不得已不要自己写。微信支付当然也是有 SDK 的(地址在这里)。但是打开以后想要引用的时候,我有点被其不专业程度 shock 到了。按照道理,像支付这样涉及钱包问题的接口,即便不包含任何服务器逻辑,也应该作得比较严谨和正规吧,但微信支付的 SDK(.Net版) 却只能算新手级别的。这样的 SDK 微信你好意思拿出来让客户用吗?
用 Teamcity 实现 .Net 平台下的持续集成 - 构建
本文中,我将以自己的一个项目作为例子,说明如何在 TeamCity 中定义并执行代码构建。 我使用的例子为自己开发的Shuhari.Framework。这是我从自己开发的项目中提炼出来的一个小型 .Net 类库,包含了方便项目开发的一些常用方法封装。你不必关心它的具体内容,我们只是把它作为一个例子来说明构建方法。
用 Teamcity 实现 .Net 平台下的持续集成 - 配置
上一篇 的安装和初始化工作完成后,网页会自动转向默认登录用户(系统管理员)主页。
用 Teamcity 实现 .Net 平台下的持续集成 - 安装
本文介绍 TeamCity 软件的安装和初始配置步骤。 首先到 TeamCity 官网 下载安装包。
用 Teamcity 实现 .Net 平台下的持续集成(目录)
本文是下面一系列文章的总目录,介绍在 .Net 平台上,如何以 JetBrains TeamCity 为工具实现代码的持续集成,也是过去一段时间工作的一个总结。完整的文章目录在 最后部分。 前言 我假设你已经了解了 持续集成 的基本概念。如果没有的话,上面的 Wikipedia 链接可以作为起点,或者阅读 Martin Fowler 大叔的文章,以及同名书籍、该领域的经典著作《持续集成》。 本文及后续的文章中有些地方会将“持续集成”按照社区的惯例简称为“CI”。它们的意思是完全相同的。
Nuget 批量删除工具
由于代码调整原因,我需要将以前发布在 nuget 上的一些包进行清理。Nuget 并不支持对包进行物理删除,这可以理解,万一有人还在继续引用呢。但是 Unlist 这个操作就有点不人道了,那么多历史版本,要逐个在控制面板里操作,还要经过好几个页面跳转,那么多版本要点击到什么时候啊?
IDE的现实分析 - 答“开发一个IDE难度有多大”
本文是看到知乎问题 开发一个IDE难度多大? 之后产生的想法。古人云:与其坐而论道,不如起而躬行。世界上已经有很多开源的IDE了,我们完全可以拿一个现实的例子来分析,知道实现一个IDE到底有多大的难度。