我正在尝试编写一个API端点,该端点将允许用户使用Asp.NET Core 3.1将文件发送到我的服务器。
我有以下操作方法,需要响应客户端的请求并处理文件验证并存储文件。
[HttpPost, Route("api/store")]
public async Task<IActionResult> Store([FromBody] MultipartFormDataContent content)
{
// Validate the file, store it.
return Ok();
}
我正在尝试像这样从客户端发送文件
using HttpClient client = new HttpClient();
var multiForm = new MultipartFormDataContent();
multiForm.Add(new StringContent("1/12/1.jpg"), "custom_file_name");
FileStream fs = System.IO.File.OpenRead("1.jpg");
multiForm.Add(new StreamContent(fs), "file");
// send request to API
var url = "https://localhost:123/api/store";
var response = await client.PostAsync(url, multiForm);
但是服务器返回HTTP Code 404 Not Found
。
如何正确调整上面的Store
方法,以便它接受客户端发送的文件?
您不应在操作方法路径中包含api/
。控制器的路径已经以api
为前缀。另外,api/[controller]
表示控制器路由为api/ControllerName
,那么您的动作将为api/ControllerName/store
。
如果您的控制器类名为ThingsController
,则其路由为api/things
,并且您的Store
操作应为api/things/store
。
您无需在动作上同时使用HttpPost
和Route
属性。 Route
属性接受所有HTTP动词,因此使用一个或另一个(通常只使用HttpPost
或您将使用action方法处理的任何HTTP动词。所以:
[ApiController]
[Route("api/[controller]")]
public class ThingsController : ControllerBase
{
// POST api/things/store
[HttpPost("store")]
public async Task<IActionResult> Store([FromBody] MultipartFormDataContent content)
{
// Do stuff
}
}