C# 过帐文件时请求错误(400)
我有一个.NET Core API项目,它有一个简单的端点来上载文件:C# 过帐文件时请求错误(400),c#,asp.net-web-api,asp.net-core,postman,C#,Asp.net Web Api,Asp.net Core,Postman,我有一个.NET Core API项目,它有一个简单的端点来上载文件: [Route("api/[controller]")] [ApiController] public class FilesController : Controller { private IFilesService _filesService { get; set; } public FilesController(IFilesService filesService) {
[Route("api/[controller]")]
[ApiController]
public class FilesController : Controller
{
private IFilesService _filesService { get; set; }
public FilesController(IFilesService filesService)
{
_filesService = filesService;
}
[HttpPost]
public async Task<IActionResult> UploadFile(IFormFile file)
{
var model = await _filesService.UploadFile(file);
return Ok();
}
}
[路由(“api/[控制器]”)]
[ApiController]
公共类FileController:控制器
{
私有IFilesService_filesService{get;set;}
公共文件控制器(IFilesService文件服务)
{
_filesService=filesService;
}
[HttpPost]
公共异步任务上载文件(IFormFile)
{
var model=await\u filesService.UploadFile(文件);
返回Ok();
}
}
我曾尝试使用Postman来测试这一点,但每次我将文件发布到端点时,都会收到400个错误请求。我的端点从未被击中
我还有其他几个POST端点工作得很好,所以这个特定端点或Postman都有问题。以下是我在Postman中的设置:
我一直在旋转我的轮子,试图找出问题是什么,但这根本没有什么,我下面的例子我在网上看到的
我做错了什么?在Postman客户端中尝试下面的url
http://localhost:5001/api/Files/UploadFile
试试这个
[HttpPost]
public async Task<IActionResult> UploadFile([FromForm]IFormFile file)
{
var model = await _filesService.UploadFile(file);
return Ok();
}
[HttpPost]
公共异步任务上载文件([FromForm]ifformfile)
{
var model=await\u filesService.UploadFile(文件);
返回Ok();
}
并删除ApiController属性我看到您已经设置了
[ApiController]
属性,所以我假设您正在运行ASP.Net Core 2.1
如果尚未设置,请尝试将services.AddMvc()
修改为services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version\u 2\u 1)代码>在Startup.cs中
不久前我也遇到过类似的问题,上面的更改为我解决了这个问题。我找到了问题的答案
希望这有帮助 我在尝试通过AJAX而不是Form.Submit发布FormFile时遇到了同样的问题,但在任何在线位置都找不到完整的解决方案。我将在这里发布我的解决方案,以防其他人偶然发现
我的问题是控制器上的[AutoValidateAntiForgeryToken]属性,就像Cole W在评论中提到的那样。这似乎与Steven最初面临的问题不同,但显然@Html.AntiForgeryToken()
将使用令牌创建一个隐藏的表单字段\uu RequestVerificationToken,以便在提交时发布。但是,当您尝试手动发布表单时,这并没有完成,您必须自己添加此字段。对我来说,客户端代码最终是这样的:
const formData = new FormData();
formData.append('file', file);
formData.append(
'__RequestVerificationToken',
$('input[name=__RequestVerificationToken]').val());
$.ajax({
cache: false,
type: 'POST',
url: 'somePostUrl',
data: formData,
contentType: false,
processData: false
});
邮递员将相当于一个额外的密钥/值对,尽管需要找到一种方法来获取实际的令牌。出于测试目的,如果由于[AutoValidateAntiForgeryToken]属性位于基类中而无法简单删除该属性,则可以将[IgnoreAntiforgeryToken]添加到当前控制器或端点方法
希望这在将来能让人省去一些头痛!我在这方面浪费了不少时间…这给了我一个404未找到,我正在发布到正确的URL您是否尝试使用asp.net web表单/视图?这实际上允许我访问端点。现在唯一的问题是文件
为空。但这比我以前拥有的要好。哇,太谢谢你了,我从来没有找到过。是的,我浪费了一整天的时间才找到。很高兴我能帮忙。:)我的问题与控制器方法上的[ValidateAntiForgeryToken]
属性有关。出于测试目的,我移除了它,它开始工作。