0

作为我正在尝试完成的示例,我在这里MapPost手动解析 HTTP 请求的正文。

// Program.cs

using System.Text.Json;

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

Type[] types = new[] { typeof(SampleDto1), typeof(SampleDto2), <other unknown types> };

foreach (var type in types)
{
    app.MapPost(type.Name, async (HttpContext httpContext) =>
    {
        var request = await JsonSerializer.DeserializeAsync(
            httpContext.Request.Body,
            type,
            new JsonSerializerOptions(JsonSerializerDefaults.Web),
            httpContext.RequestAborted);

        return Results.Ok(request);
    });
}

app.Run();

internal record SampleDto1(string Input) { }
internal record SampleDto2(string Input) { }

这行得通,耶!但是,... ASP.NET Core 的 MVC 具有所有这些复杂的 ModelBinding 功能,我真的很想使用它。因为这开辟了绑定到查询字符串参数和其他来源的可能性,而不仅仅是请求正文。

基本上我想JsonSerializer用调用框架代码替换调用。

我一直在浏览 ASP.NET Core 源代码,起初DefaultModelBindingContext看起来很有希望。但是,我很快偶然发现了一些我无法从我的代码中访问的内部类。

长话短说,.. 是否有可能从应用程序代码插入 MVC 的模型绑定?


更新:虽然它没有从最初的问题中显示出来,但该解决方案应该可以动态地处理任何请求类型。不仅SampleDto1SampleDto2。这就是为什么来自 Minimal API 的显式参数绑定不起作用的原因。

4

1 回答 1

1

您可以尝试以下代码:

using Microsoft.AspNetCore.Mvc;

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
builder.Services.AddSingleton<Service>();
app.MapPost("/{id}", ([FromRoute] int id,
                     [FromQuery(Name = "p")] int page,
                     [FromBody]SampleDto1 sample1,
                     [FromBody] SampleDto2 sample2,
                     [FromServices] Service service,
                     [FromHeader(Name = "Content-Type")] string contentType)
                     => { });
app.Run();

internal record SampleDto1(string Input) { }
internal record SampleDto2(string Input) { }

您可以阅读官方文档了解更多详情: https ://docs.microsoft.com/en-us/aspnet/core/fundamentals/minimal-apis?view=aspnetcore-6.0#explicit-parameter-binding

于 2022-02-14T05:59:05.630 回答