asp.net 最少的API和XML格式化程序

h9a6wy2h  于 2022-11-19  发布在  .NET
关注(0)|答案(2)|浏览(142)

在.NET 6中尝试了最少的API,但无法使其与XML内容类型一起工作。如果我使用标准控制器,使用.AddXmlSerializerFormatters()扩展可以完成这项工作:

builder.Services.AddControllers().AddXmlSerializerFormatters();

但是当我从控制器切换到.MapPost(..)时,我开始得到415个HTTP响应。

app.MapPost("/endpoint", ([FromBody] Request request) => {})
.Accepts<Request>("text/xml");

HTTP回应:415错误信息。应为支持的JSON媒体类型,但得到的是“text/xml”
有没有其他方法可以声明使用最少API的XML格式化程序?

0sgqnhkj

0sgqnhkj1#

正如guru-stron链接的文章所建议的,通过实现自己的 Package 模型(提供BindAsync方法)可以传递XML文档。

internal sealed class XDocumentModel
{
    public XDocumentModel(XDocument document) => Document = document;

    public XDocument Document { get; init; }

    public static async ValueTask<XDocumentModel?> BindAsync(HttpContext context, ParameterInfo parameter)
    {
        if (!context.Request.HasXmlContentType())
            throw new BadHttpRequestException(
                message: "Request content type was not a recognized Xml content type.",
                StatusCodes.Status415UnsupportedMediaType);

        return new XDocumentModel(await XDocument.LoadAsync(context.Request.Body, LoadOptions.None, CancellationToken.None));
    }
}

我向HttpRequest添加了一个扩展方法,以方便内容类型验证。

internal static class HttpRequestXmlExtensions
{
    public static bool HasXmlContentType(this HttpRequest request)
        => request.Headers.TryGetValue("Content-Type", out var contentType)
        && string.Equals(contentType, "application/xml", StringComparison.InvariantCulture);
}

然后,您可以通过最小API端点直接将模型用作参数。

app.MapGet("/xml-test", (XDocumentModel model) =>
{
    // model.Document <- your passed xml Document
    return Results.Ok(new { Value = model.Document.ToString() });
})

**最后的一些想法:**此实现使您能够将泛型XML文档传递到终结点。但是,如果您需要特定的文档结构,则可以通过使XDocumentModel需要泛型类型参数并从XDocument示例提取此类型的属性来实现此实现。

t2a7ltrp

t2a7ltrp2#

我是这样做的:

app.MapPost("/endpoint", (HttpContext c) => 
{
    var reader = new StreamReader(c.Request.Body);
    var xml = reader.ReadToEndAsync().Result;
    // You can do with your xml string whatever you want
    return Results.Ok();
}).Accepts<HttpRequest>("application/xml");

相关问题