背景
下一篇在继续 Go 的学习笔记,因为这阵子一直有项目压着,确实没有精力去总结学习成果。所以这篇就先换换口味,切回老本行,分享一下.net 6 的一个小知识。
前些天,我们对外提供的一些管理系统,要升级一下消息中心,之前我是用微软的 signalr 框架来做的,但由于用户提供的服务器是 Windows server 2008,版本较低,没办法支持 websocket,所以 signalr 框架自动给降级成了 SSE 机制,降级之后,由于网络抖动问题,导致链接经常莫名其妙的就断开了,也是因为不是长链接,所以判定链接是否断开也有点复杂,也就没办法在准确的时机来执行重连机制。所以不得不说,Windows server 2012 之前的服务器版本真的太拉胯了。
这种情况按说最好的解决办法就是升级一下用户服务器系统,但这几乎是不可能的,所以就想了一个办法,接入一下第三方的 IM 服务,这样,消息的控制中心全部转移到第三方,来回的消息推送也通过第三方来执行,虽然多了一些开发成本,但这已经是目前情况下的最优解了。
正好也可以借此机会,来体验一下.net 6 最新推出的 mini api,话说这还是当时.net 6 框架推出时的一个主打特性,据说是参考了 Go 这样的新型语言特性,推出的一个超级轻量级的 webapi 开发框架,因为采用了"top-level statements"(不知道咋翻译更合适,属于只能意会不能言传吧~哈哈)这样的语法特性,所以新建的项目文件代码非常精炼。
创建项目
创建项目本身没啥好说的,只是因为要用最小化开发,所以在选择的时候注意一下,最下面那个“使用最小 API”和“Do not use top-level statements”的选项不要勾选哦,如果勾选了,就是之前的老面孔了,其余的按需选择就好。
新建好的项目,是这样
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
var summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
app.MapGet("/weatherforecast", () =>
{
var forecast = Enumerable.Range(1, 5).Select(index =>
new WeatherForecast
(
DateTime.Now.AddDays(index),
Random.Shared.Next(-20, 55),
summaries[Random.Shared.Next(summaries.Length)]
))
.ToArray();
return forecast;
})
.WithName("GetWeatherForecast");
app.Run();
internal record WeatherForecast(DateTime Date, int TemperatureC, string? Summary)
{
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}
复制代码
因为我勾选了启用 openapi,所以,代码会对多几行,为了体现它的“最小”特性,我把默认的天气接口和 swagger 相关的配置都去掉。然后就成这样了~
只剩 3 行,甚至这三行还可以简化成 1 行,呈现成 3 行纯纯只是为了清晰。
依赖注入
项目建好后,我们还是老规矩,编写接口和接口方法。这里我是接入的腾讯云 IM 的服务端接口,也就先浅浅的展示一个例子,跑通之后,剩下的就是纯体力劳动了~
接入腾讯云 IM
首先要在腾讯云控制台,开通 IM 服务,这里呢,我们这边因为是后台管理系统使用,所以用户量不多,采用的是免费版,大家有需要的可以到官网了解下。
接入流程官方文档也给的很明白,首先先是获取 usersig,这个呢,官方提供了 sdk,我这里也就是捡了个现成的,直接接入。大家做接入的时候,也可以按官方提供的方案接入,除了可以在服务端生成 usersig,也可以在客户端生成,但为了安全,还是在后端生成吧~
得到这个字符串后,可以先到腾讯云的控制台验证一下自己的生成的 usersig 对不对,如果验证是通过的,就可以继续接入服务端接口了,这样可以稍微提高一点效率~
这样就算是验证通过了,然后开始编写接口方法来。
接口函数
public interface IAccountAPI
{
Task<dynamic> Import(string userId, string nick = "", string faceUrl = "");
}
复制代码
然后实现接口方法
internal class AccountAPI : IAccountAPI
{
public AccountAPI()
{
}
public CommonRequestModel requestModel = new CommonRequestModel();
public async Task<dynamic> Import(string userId,string nick="",string faceUrl="")
{
requestModel.usersig = new TLSSigAPIv2({你的sdkid}, "{你的秘钥}").genUserSig(requestModel.identifier);
AnsiConsole.WriteLine($"usersig:{requestModel.usersig}");
requestModel.sdkappid = {你的sdkid};
HttpClient client = new HttpClient();
var response = await client.PostAsync("https://console.tim.qq.com/v4/im_open_login_svc/account_import"+requestModel.urlParam, new StringContent(
System.Text.Json.JsonSerializer.Serialize(new { UserID = userId, Nick = nick, FaceUrl = faceUrl })
));
return await response.Content.ReadAsStringAsync();
}
}
复制代码
注入
接口编写好后,就可以注入到容器中了
using API.TecentLib;
using Microsoft.AspNetCore.Mvc;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddScoped<IAccountAPI, AccountAPI>();//注入接口实例
var app = builder.Build();
复制代码
request
app.MapPost("/import", async ([FromBody] ImportModel user, IAccountAPI accountapi) =>
{
Console.WriteLine(await accountapi.Import(user.user));
});
复制代码
区别于传动的 controller 形式,mini api 最大的特点就是可以通过简单的形式,来构造路由,仅仅需要两个参数就可以实现想要的功能。
app.MapPost 标识这是一个 post 方法,对应的还有 MapGet,MapPut,MatDelete 方法,来区别不同的请求方式,第一个参数标识请求路由,第二个参数是实现方法,而实现方法可以是一个 lambda 表达式,也可以是一个具体的方法。
response
上面的结果,我们就可以实际得到腾讯云返回的实际内容了
但我们的目的并不是让她打印在控制台上,还要作为 json 结构返回到客户端,所以稍加改造
app.MapPost("/import", async ([FromBody] ImportModel user, IAccountAPI accountapi) =>
{
return new { code = 0, msg = "success", data = await accountapi.Import(user.user) };
});
复制代码
在通过 postman 来测试一下
OK,如此,通过集成腾讯云的 IM 这样一个实际的案例,浅尝了一下 MINI API 的魅力,总体来说非常舒服,如果只是开发小型甚至中型的一些接口,这种形式无疑非常适合,而且效率奇高!
好了今天就这样了。
评论