钾肥喵的窝

我在 CODING 部署的 Hexo 博客

0%

ASP.NET Core Minimal Web API与参数传递以及CORS

缘起

起因是想写一个教务系统验证码自动填写脚本, 也就是这个仓库, 花了一天时间研究TorchSharp怎么用之后就陷入了参数传递和CORS的泥淖中, 因此写下这篇博客记录一下.

参数传递

首先看看著名的MSDN是怎么说的: Parameter Binding in ASP.NET Web API

默认情况下, 对于 "简单" 类型, ASP.NET Core会尝试从URL中获取, 但是这个项目中我们需要传递的参数是一张图片的base64, 大概率会出现URL过长的问题.

因此需要使用[FromBody]属性限定参数从请求体中获取, 接着使用Postman就是各种尝试都没办法调用接口. 经过一番尝试, 终于找到了正确方法(适用于string类型):

  • 设置Content-Typeapplication/json
  • Body中只放一个用双引号包裹的字符串

这是Body示例

1
"iVBORw0KGgoAAAA"

以下是一个API示例

1
2
3
4
5
6
7
8
9
app.MapPost("/predictbase64", ([FromBody]string base64) =>
{
var bytes = Convert.FromBase64String(base64);
var image = read_image(new MemoryStream(bytes), ImageReadMode.RGB, new SkiaImager(100)).@float().view(1, 3, 60, 180);
var result = MyDataset.myDecode(model.call(image));
return Results.Ok(result);
})
.WithName("PredictBase64")
.WithOpenApi();

CORS

因为本地测试没有用HTTPS, 出现了跨域问题, 被Edge拦截了, 参照网上的方法关闭Block insecure private network requests选项并没有什么卵用.

那只能从代码入手了, 只要响应标头加上Access-Control-Allow-Origin就差不多了, 使用中间件给响应标头设置相关属性, 代码如下:

1
2
3
4
5
6
7
8
9
app.Use(async (context, next) =>
{
context.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
context.Response.Headers.Add("Access-Control-Allow-Headers", new[] { "*" });
context.Response.Headers.Add("Access-Control-Allow-Methods", new[] { "GET, POST, PUT, DELETE, OPTIONS" });
context.Response.Headers.Add("Access-Control-Allow-Credentials", new[] { "true" });

await next.Invoke();
});

加上了中间件还不够, API预检的响应码还是405, 因此还需要写一个同名的API去响应OPTIONS请求, 返回200就能通过预检, 这样浏览器才会继续执行请求.

1
app.Map("/predictfile", CORS).WithOpenApi();

CORS方法定义如下:

1
2
3
4
5
[HttpOptions]
private static IResult CORS()
{
return Results.Ok();
}