缘起
起因是想写一个教务系统验证码自动填写脚本, 也就是这个仓库, 花了一天时间研究TorchSharp怎么用之后就陷入了参数传递和CORS的泥淖中, 因此写下这篇博客记录一下.
参数传递
首先看看著名的MSDN是怎么说的: Parameter Binding in ASP.NET Web API
默认情况下, 对于 "简单" 类型, ASP.NET Core会尝试从URL中获取, 但是这个项目中我们需要传递的参数是一张图片的base64, 大概率会出现URL过长的问题.
因此需要使用[FromBody]
属性限定参数从请求体中获取,
接着使用Postman就是各种尝试都没办法调用接口. 经过一番尝试,
终于找到了正确方法(适用于string
类型):
- 设置
Content-Type
为application/json
Body
中只放一个用双引号包裹的字符串
这是Body
示例 1
"iVBORw0KGgoAAAA"
以下是一个API示例
1 | app.MapPost("/predictbase64", ([FromBody]string base64) => |
CORS
因为本地测试没有用HTTPS, 出现了跨域问题, 被Edge拦截了,
参照网上的方法关闭Block insecure private network requests
选项并没有什么卵用.
那只能从代码入手了,
只要响应标头加上Access-Control-Allow-Origin
就差不多了,
使用中间件给响应标头设置相关属性, 代码如下:
1 | app.Use(async (context, next) => |
加上了中间件还不够, API预检的响应码还是405,
因此还需要写一个同名的API去响应OPTIONS
请求,
返回200就能通过预检, 这样浏览器才会继续执行请求.
1 | app.Map("/predictfile", CORS).WithOpenApi(); |
CORS
方法定义如下:
1 | [ ] |