我有一个简单的 ASP.NET Core Web API。请求将使用
application/xml
媒体类型。但是,我想在控制器内将其作为字符串读取,并在将该字符串转换为 XML 之前进行一些检查。像这样的简单方法会返回“http 415 - 不支持媒体类型”错误。
[HttpPost()]
public async Task<IActionResult> UpdateStatus([FromBody] string msg)
{}
我可以添加
AddXmlSerializerFormatters
并从正文中获取我想要的对象,但这会绕过一些错误处理。有没有办法将 application/xml
读取为字符串?
我们通常使用
StreamReader
来读取XML内容。
[HttpPost]
[Route("update-status")]
public async Task<IActionResult> UpdateStatus()
{
using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8))
{
string xmlContent = await reader.ReadToEndAsync();
if (string.IsNullOrWhiteSpace(xmlContent))
{
return BadRequest("Empty XML content");
}
return Ok($"Received XML content: {xmlContent}");
}
}
如果您仍然想从
[FromBody] string msg
获取xml内容,我们可以创建自定义InputFormatter
来实现此功能。
PlainTextInputFormatter.cs
using Microsoft.AspNetCore.Mvc.Formatters;
using System.Text;
using Microsoft.Net.Http.Headers;
namespace WebApplication1
{
public class PlainTextInputFormatter : InputFormatter
{
public PlainTextInputFormatter()
{
SupportedMediaTypes.Add(MediaTypeHeaderValue.Parse("text/plain"));
SupportedMediaTypes.Add(MediaTypeHeaderValue.Parse("application/xml"));
SupportedMediaTypes.Add(MediaTypeHeaderValue.Parse("text/xml"));
}
protected override bool CanReadType(Type type)
{
return type == typeof(string);
}
public override async Task<InputFormatterResult> ReadRequestBodyAsync(InputFormatterContext context)
{
var request = context.HttpContext.Request;
using (var reader = new StreamReader(request.Body, Encoding.UTF8))
{
var content = await reader.ReadToEndAsync();
return await InputFormatterResult.SuccessAsync(content);
}
}
}
}
注册
builder.Services.AddControllers(options =>
{
options.InputFormatters.Insert(0, new PlainTextInputFormatter());
});
测试代码及测试结果