摘要: 在 .NET Framework 与 .NET Core 中 HttpClient 有个臭名昭著的问题,HttpClient 实现了 IDispose 接口,但当你 Dispose 它时,它不会立即关闭所使用的 tcp 连接,而是将 tcp 连接置为 TIME_WAIT 状态,240秒(4分钟)后才真正关闭连接。对于高并发的场景,比如每秒 1000 个请求,每个请求都用到 HttpClient阅读全文
posted @ 2018-10-31 16:30 dudu 阅读(1376) 评论(13) 编辑
摘要: 在我们 2015 年开始的从 .NET Framework 向 .NET Core 迁移的工程中,遇到的最大的坑就是标题中所说的——同步方法中调用异步方法发生”死锁”。虽然在 .NET Framework 时代就知道不能在同步方法中调用异步方法,但我们却明知路有坑,偏向此路行。不是我们自讨苦吃,而是被迫无奈阅读全文
posted @ 2018-10-29 10:54 dudu 阅读(2837) 评论(45) 编辑
摘要: 最近在阅读 .NET Threadpool starvation, and how queuing makes it worse 这篇博文时发现文中代码中的一种 Task 用法之前从未见过,在网上看了一些资料后也是云里雾里不知其解,很是困扰。今天在程序员节的大好日子里终于想通了,于是写下这篇随笔分享给大家阅读全文
posted @ 2018-10-24 22:19 dudu 阅读(4746) 评论(41) 编辑
摘要: 接手一台跑在 Tomcat 上的 Java Web 应用的服务器,通过镜像的方式更换服务器后站点无法访问,发现是因为 Tomcat 不能在服务器启动后自动启动,于是基于 init.d 将 Tomcat 配置为以服务方式自动运行。阅读全文
posted @ 2018-10-21 17:11 dudu 阅读(78) 评论(0) 编辑
摘要: SQLite 内存数据库(in-memory database)的连接字符串是 Data Source=:memory: ,它的特点是数据库连接一关闭,数据库就会被删除。而使用 services.AddDbContext 通过连接字符串配置 EF Core 时,EF Core 会在每次查询或 SaveChanges 后立即关闭数据库连接。在这样的情况下,集成测试中就无法在向 SQLite 内存数据库写入数据库后进行查询测试。阅读全文
posted @ 2018-10-10 14:02 dudu 阅读(171) 评论(0) 编辑
摘要: .NET Core 2.0 引入了 IHostedService ,基于它可以很方便地执行后台任务,.NET Core 2.1 则锦上添花地提供了 IHostedService 的默认实现基类 BackgroundService ,在这篇随笔中分别用 Web 与 Console 程序体验一下。阅读全文
posted @ 2018-09-14 18:08 dudu 阅读(276) 评论(0) 编辑
摘要: 在 ASP.NET Core 中如果在 DataProtection 中使用了 PersistKeysToFileSystem 或 PersistKeysToFileSystem,会在日志中出现告警,这是由于 DataProtection 所用到的密钥本身没有被加密存储,要消除这个告警,需要一个专门用来加密“密钥”的密钥,首先用 openssl 命令创建密钥,得到 cnblogs.pfx 文件阅读全文
posted @ 2018-09-05 16:05 dudu 阅读(213) 评论(1) 编辑
摘要: 实际应用场景是将用户上传的文件依次保存到阿里云 OSS 与腾讯云 COS ,实现方式是在启用 Request.EnableRewind() 的情况下通过 Request.Body 读取流,并依次通过 2 个 StreamContent 分别上传到阿里云 OSS 与 腾讯云 COS ,在集成测试中可以正常上传,而部署到服务器上通过浏览器上传却出现了奇怪的问题阅读全文
posted @ 2018-08-26 17:25 dudu 阅读(221) 评论(2) 编辑
摘要: 这两天在一个 ASP.NET Core 项目中遭遇了 AutoMapper ProjectTo 不起作用的奇怪问题,虽然在 ProjectTo 中指定了 DTO ,但 EF Core 生成的 SQL 语句还是 SELECT 了实体类的所有字段(除了在 EF Core 映射配置中忽略的字段),而期望的是至 SELECT DTO 中的字段。阅读全文
posted @ 2018-08-15 18:00 dudu 阅读(171) 评论(0) 编辑
摘要: 我们基于 Razor Class Library 实现了自定义错误页面的公用类库(详见之前的随笔),但是在实际使用时发现如果在 middleware 中发生了异常,则不能显示自定义错误页面,而是返回默认的 500 空白页面。当 middleware 中产生异常时,在去往自定义错误页面的途中,又途径异常 middleware ,从而让自定义错误页面也产生了异常阅读全文
posted @ 2018-08-06 18:10 dudu 阅读(134) 评论(3) 编辑
摘要: 最近在加强持续集成,遇到一个场景需要通过 gitlab-ci 环境变量(Settings -> Settings -> CI/CD -> Variables )在持续集成时向 ASP.NET Core 应用传递配置。ASP.NET Core 默认就启用了从环境变量读取配置,在 WebHost.CreateDefaultBuilder() 中包含了 config.AddEnvironmentVariables() ,只要用正确的格式传递配置,就能搞定。阅读全文
posted @ 2018-08-05 11:42 dudu 阅读(75) 评论(0) 编辑
摘要: 被这个问题困扰很久了,用 dotnet test 命令运行 xUnit.net 测试项目时,测试代码中的 Console.WriteLine() 输出的内容在控制台总是不显示。之前一直以为是 xunit runner 屏蔽了控制台的输出,昨天在博问进行了提问 —— 请问 xUnit 在 .NET Core 中是如何屏蔽控制台输出的,今天在 xUnit 的源代码中苦苦搜寻阅读全文
posted @ 2018-07-30 18:30 dudu 阅读(163) 评论(0) 编辑
摘要: 问题来自博问的一个提问 .net core 多线程数据保存的时候DbContext被释放 。TCPService 通过构造函数注入了 ContentService , ContentService 的实例依赖了 AppDbContext (继承自 EF Core 的 DbContext)。在 TCPService 中通过 Thread.Start 启动了一个新的线程执行了 TCPService 中的 Receive 方法阅读全文
posted @ 2018-07-23 11:46 dudu 阅读(352) 评论(4) 编辑
摘要: 作为 .NET 程序员,痛苦之一是自从 ASP.NET 诞生之日起直到最新的 ASP.NET Core 都无法直接实现跨站登录重定向,只能跳转到当前站点。具体拿 ASP.NET Core 来说就是 CookieAuthenticationOptions.LoginPath 只能指定路径,不能指定包含主机名的完整 url ,ASP.NET Core 会在重定向时自动加上当前请求的主机名。阅读全文
posted @ 2018-07-19 18:22 dudu 阅读(316) 评论(0) 编辑
摘要: 一、阅读材料:All About Span: Exploring a New .NET Mainstay, Span阅读全文
posted @ 2018-07-02 16:15 dudu 阅读(352) 评论(1) 编辑
摘要: WebApplicationFactory 是 ASP.NET Core 2.1 新特性 MVC functional test infrastructure 中带来的新东东,它封装了 TestServer 的使用,让 ASP.NET Core 的集成测试更简便、配置更灵活。阅读全文
posted @ 2018-06-18 16:47 dudu 阅读(229) 评论(0) 编辑
摘要: ASP.NET Core 中的 Request.Body 虽然是一个 Stream ,但它是一个与众不同的 Stream —— 不允许 Request.Body.Position=0 ,这就意味着只能读取一次,要想多次读取,需要借助 MemoryStream ,详见博问 asp.net core中2次读取Request.Body的问题阅读全文
posted @ 2018-06-16 16:51 dudu 阅读(1678) 评论(3) 编辑
摘要: ResponseCaching 提供了 VaryByHeader 与 VaryByQueryKeys 这两种种方式配置缓存 Key ,我们在使用 VaryByHeader 时发现一个问题 —— 使用 VaryByHeader 时如果不做限制,会面临缓存被撑爆的风险。比如上面根据 Accept 请求头进行缓存,由于客户端可以任意修改请求头,如果有爬虫发出大量的请求阅读全文
posted @ 2018-06-14 12:58 dudu 阅读(133) 评论(1) 编辑
摘要: 在 .NET Core 2.1 中,System.Net.Sockets 的性能有了很大的提升,最好的证明是 Kestrel 与 HttpClient 都改为使用 System.Net.Sockets ,stackoverflow 上也有人提到了,详见 libuv vs sockets in asp.net core 2.1 。这两天阅读了 corefx 中 HttpClient 的 SocketsHttpHandler 部分实现代码,学习了一下它是如何在异步方法中连接 Socket 的阅读全文
posted @ 2018-06-10 14:31 dudu 阅读(421) 评论(3) 编辑
摘要: 在 HttpClientFactory 出生之前,由于 HttpClient 臭名昭著的“dispose之后4分钟tcp连接才会被关闭”问题(详情),只能使用单例或静态的 HttpClient ,但这会带来一个副作用,如果 dns 解析更新了,HttpClient 不会自动更新IP地址。随着 .NET Core 2.1 的发布,HttpClientFactory 横空出世,有效解决了 HttpClient 的生命周期与 TCP 连接管理的问题。阅读全文
posted @ 2018-06-03 20:48 dudu 阅读(759) 评论(2) 编辑