我在 API Controller 上开发 C# (.Net 5) 方法时遇到问题,该 Controller 可以管理具有“multipart/form-data”的请求;边界=边界'
我无法在客户端更改请求,我只能修改我的后端以适应它。
请求指定'Content-Type: multipart/form-data; boundary=boundary',它的正文中有一条我需要提取的 json 消息。
在请求的正文中,消息是这样的:
--boundary
Content-Disposition: form-data; name="ZZZZZZZZZZ"
Content-Type: application/json
Content-Length: 474
{
//a well formed json
}
--boundary--
我可以使用以下代码获取:string dataMessage = new StreamReader(Request.Body).ReadToEndAsync().Result;
然后我可以使用 IndexOf 和 Substring 手动解析该字符串以仅提取 json 部分,然后使用 JsonConvert 将其转换为对象。
我想知道 .Net 上是否有一些选项可以自动执行此操作而无需手动解析字符串。我认为必须有某种方法来解释边界标记并获得直接json数据。但我找不到任何 :( 我想到了这一点,因为当使用 webhook.site 测试客户端请求时,它可以毫无问题地解析消息。
我的 Controller 定义是这样的
[ApiController]
[Route("api/[controller]")]
public class XXXXController : ControllerBase
方法是这样的
[HttpPost]
[Route("[action]")]
public IActionResult YYYYYYY()
我已经尝试指定模型绑定(bind)来更改行为,但我无法让它工作。
而且我在询问之前已经搜索了帮助:
- https://learn.microsoft.com/en-us/aspnet/core/mvc/models/model-binding?view=aspnetcore-5.0#model-binding-for-http-get-requests
- https://forums.asp.net/t/2162362.aspx?Read+POST+data+in+request+body
- How to get POST data in WebAPI?
- how to read multi part form data in .net web api controller
- ASP.NET MVC. How to create Action method that accepts and multipart/form-data
- 415 Unsupported Media Type when uploading "multipart/form-data" to .Net Core 3.1 API but the file is accessible in middleware method
- ASP.NET Core form POST results in a HTTP 415 Unsupported Media Type response
- ASP.NET How read a multipart form data in Web API?
- How to send multipart/form-data to ASP.NET Core Web API?
- How to set up a Web API controller for multipart/form-data
- Send POST request through WebClient with boundary
- Web API Simplest way to pickup a multipart/form-data response
- How to get Json Post Values with asp.net webapi
- What is the boundary in multipart/form-data?
- C# HTTP POST with Boundary
- How to set MIME type for POST - multipart/form-data in axios?
感谢您的帮助!
最佳答案
默认情况下,.Net5 中不支持multi-part/form-data
媒体类型。因此,输入格式化程序应附加到 MvcBuilder
。
考虑到您无法操纵客户端,ApiMultipartFormDataFormatter这使得可以使用这种类型的输入格式。
- 添加包:
Install-Package ApiMultipartFormDataFormatter -Version 3.0.0
在
Startup.cs
中配置格式化程序public void ConfigureServices(IServiceCollection services) { services.AddControllers(options => { options.InputFormatters.Add(new MultipartFormDataFormatter()); }); }
假设上面提到的格式良好的 json 类似于下面的类:
public class CustomContent { public string Name { get; set; } }
因此,我们需要将它包装到另一个包含 this 作为参数的类中。 注意:库目前不支持反序列化,因此,将一个 getter-only 属性添加到返回反序列化对象的模型中。
public class ViewModel { // Equivalent to ZZZZZZZZZZ public string SerializedContent { get; set; } public CustomContent Content => !string.IsNullOrEmpty(SerializedContent) ? JsonConvert.DeserializeObject<CustomContent>(SerializedContent) : null; }
修改 Action 以接受包装器模型。
[HttpPost] [Route("[action]")] public IActionResult Parse(ViewModel vm) { return Ok($"Received Name: {vm?.Content?.Name}"); }
对应示例的工作cURL请求为:
curl --location --request POST 'http://localhost:25599/api/MultiPart/Parse'
\
--header 'Content-Type: multipart/form-data; boundary=boundary' \
--data-raw '--boundary
Content-Disposition: form-data; name="SerializedContent"
Content-Type: application/json
Content-Length: 100
{
"Name" : "Foo"
}
--boundary--'
响应应等于Received Name: Foo
。
关于c# - API Controller POST 方法 multipart/form-data 在正文中使用边界获取消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68834176/