生成 HTTP 查询字符串

什么是 HTTP 查询字符串 例如此 URL:https://example.com:80/query?key1=value2&key2=value2 对其拆解我们可以得到以下部分: https:协议 :// example.com:域名 :80:端口 /query:路径 ?key1=value2&key2=value2:参数(也称作查询字符串) 如何生成 HTTP 查询字符串 暴力拼接 略 System.Web.HttpUtility var query = HttpUtility.ParseQueryString(string.Empty); query["a+b"] = "a%b"; query["b"] = "2+1"; var queryString = query.ToString(); // a+b=a%25b&b=2%2b1 HttpUtility.ParseQueryString(string.Empty) 会返回一个空的NameValueCollection,你只需要往里面填充参数然后调用ToString()即可生成查询字符串 您不能使用 new NameValueCollection() 来达到同样的效果,因为 HttpUtility.ParseQueryString(string) 返回的实际是 HttpQSCollection 类型,该类型是 NameValueCollection 的派生类型且不对外公开,所以你也无法通过 new 关键字来创建 HttpQSCollection 类型 此方法生成的查询字符串只会转义 value 且不包含前导字符 ? Microsoft.AspNetCore.Http.QueryString 此方法仅适用于 SDK 为 Microsoft.NET.Sdk.Web 的项目 var queryString = QueryString.Create(new Dictionary<string, string?> { ["a+b"] = "a%b", ["b"] = "2+1", })....

2023年2月4日

ASP.NET Core 中使用 Dapr 发布订阅

定义 subpub 组件 我们使用 Dapr 初始化时安装的 redis 作为 pubsub 的实现 创建文件 ~/.dapr/components/pubsub.yaml (Windows 用户为 %USERPROFILE%\.dapr\components\pubsub.yaml ),内容如下 Dapr 初始化后 ~/.dapr/components 文件夹会自动创建,里面有一个 statestore.yaml 的组件定义。如果没有该文件夹也不用担心,手动创建即可 apiVersion: dapr.io/v1alpha1 kind: Component metadata: name: pubsub spec: type: pubsub.redis version: v1 metadata: - name: redisHost value: localhost:6379 - name: redisPassword value: "" 创建项目 创建 ASP.NET Core WebAPI 项目 $ dotnet new webapi --no-openapi --no-https 安装 Dapr SDK dotnet CLI $ dotnet add package Dapr.AspNetCore 程序包管理器控制台 Install-Package Dapr.AspNetCore 也可以在 Visual Studio 的 Nuget 包管理器中搜索安装...

2022年12月14日

如何在 ASP.NET Core WEB API 中启动后台任务

引言 有时候我们可能想在接口中开启一个后台任务,就像这样: public class MyController : Controller { private readonly MyDependency _dep; public MyController(MyDependency d) { _dep = d; } public IActionResult MyAction() { Task.Run(() => _dep.DoHeavyAsyncWork()); return Json("Your job is started!"); } } 事实上,这段代码很符合语义,接口也能成功返回。 但是其中有一个潜在问题,随着return语句响应本次请求,ASP.NET Core会开始释放本次请求的依赖,比如控制器和控制器依赖的各种服务……,这就会导致Task.Run语句中的所依赖的定义在控制器中的服务会被释放掉,这可能会导致一些未知的问题。这些潜在问题可能会让你的应用程序随时爆炸! 让后台任务拥有自己的生存期 为了保证后台服务的依赖不随控制器释放而释放,我们需要定义一个新的服务并将其注册为单例服务,因为单例服务永远不会被释放。 创建一个名为CannonService的类 CannonService.cs public class CannonService { private readonly ILogger<CannonService> _logger; private readonly IServiceProvider _serviceProvider; public CannonService(ILogger<CannonService> logger, IServiceProvider serviceProvider) { _logger = logger; _serviceProvider = serviceProvider; } public void Fire(Delegate dg, Action<Exception>?...

2022年6月27日