微软asp.net core上传文件示例中的流式文件上传示例采用AJAX调用控制器函数上传,但是将此部分代码剥离出来运行时,会报下图所示的“400 Bad Request”的错误,一开始还以为是代码剥的有问题,后面直接运行微软示例程序,在流式文件上传页面测试时也是报相同的错误。
在火狐浏览器中用开发者工具调试,看到下面的strict-origin-when-cross-origin策略。以为是跨域访问引发的错误。于是按之前《Canvas操作图片像素》和《jQuery调用WebAPI报错“已拦截跨源请求:同源策略禁止读取位于…的远程资源”’》文章中的解决方法分别尝试了配置火狐浏览器的策略及在代码中增加了策略的设置,但是都没有用,上传文件还是报相同的错误。
builder.Services.AddCors(options =>
{
options.AddPolicy("any", builder =>
{
builder.WithMethods("GET", "POST", "HEAD", "PUT", "DELETE", "OPTIONS")
//.AllowCredentials()//指定处理cookie
.AllowAnyOrigin(); //允许任何来源的主机访问
});
});
...
...
app.UseAuthorization();
app.UseCors("any");
...
...
百度搜索asp.net core和400 Bad Request,找到了参考文献1,其中介绍了返回400的原因有可能是“代码使用了System.ComponentModel.DataAnnotations中的特性”,于是查看控制器中上传文件函数是否使用了什么特性,微软示例中在文件上传函数上添加了 [HttpPost]、[DisableFormValueModelBinding]、[ValidateAntiForgeryToken],后面两个的用法可以百度,本测试项目中就直接去掉了,仅保留了 [HttpPost]。再运行程序,即可顺利上传文件,如下图所示:
参考文献:
[1]https://blog.csdn.net/jiuzaizuotian2014/article/details/116839401