使用 ASP.NET Core Web API 从正文中将 application/xml 作为字符串读取

问题描述 投票:0回答:1

我有一个简单的 ASP.NET Core Web API。请求将使用

application/xml
媒体类型。但是,我想在控制器内将其作为字符串读取,并在将该字符串转换为 XML 之前进行一些检查。像这样的简单方法会返回“http 415 - 不支持媒体类型”错误。

 [HttpPost()]
 public async Task<IActionResult> UpdateStatus([FromBody] string msg)
 {}

我可以添加

AddXmlSerializerFormatters
并从正文中获取我想要的对象,但这会绕过一些错误处理。有没有办法将
application/xml
读取为字符串?

.net-core asp.net-core-webapi
1个回答
0
投票

我们通常使用

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());
});

测试代码及测试结果

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.