首页 > 解决方案 > 对象反序列化在 Asp Net Core MVC 控制器中的 POST 失败

问题描述

我创建了一个没有完整 MVC 模板的 API 应用程序。但是,带有正文的 POST 请求总是因内部服务器错误而失败。

对于有状态服务,我在这里遵循了完全相同的步骤:

我在 Visual Studio 中使用 Stateful Service 模板创建了一个项目。我添加了一个 Kestrel 监听器,如下所述:

protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
{
    return new ServiceReplicaListener[]
    {
        new ServiceReplicaListener(serviceContext =>
            new KestrelCommunicationListener(serviceContext, (url, listener) =>
                new WebHostBuilder()
                    .UseKestrel()
                    .ConfigureServices(
                         services => services
                             .AddSingleton<StatefulServiceContext>(serviceContext)
                             .AddSingleton<IReliableStateManager>(this.StateManager))
                    .UseContentRoot(Directory.GetCurrentDirectory())
                    .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.UseUniqueServiceUrl)
                    .UseStartup<Startup>()
                    .UseUrls(url)
                    .Build()
            ))
    };
}

然后,我添加了一个 Startup 类和一个测试控制器: internal class Startup { public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { services.AddMvcCore(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseMvc(); } }

[Route("[controller]")]
[ApiController]
public class MyController : ControllerBase
{

    [HttpGet("Read1")]
    public async Task<ActionResult<string>> Read1()
    {
        return "asd";
    }
    [HttpPost("Read2")]
    public async Task<ActionResult<string>> Read2()
    {
        return "asd";
    }
    [HttpPost("Read3")]
    public async Task<ActionResult<MyOutput>> Read([FromBody]MyInput input)
    {
       
        var a = new MyOutput();
        a.Value= "asdasd";
        return a;
        
    }
}

using System.Runtime.Serialization;
[DataContract]
public class MyInput
{

    [DataMember]
    public string Value{ get; }

    public MyInput(string val)
    {
        Value= val;
    }
}

当我向这 3 个端点发出请求时,/Read1 和 /Read2 请求工作正常。但是,/Read3 请求失败,客户端出现内部服务器错误,我试图在控制器中放置一个断点,但对于 /Read3 它永远不会命中它。这让我觉得反序列化不起作用。

我从 Insomnia 发送请求。一个简单的 POST 请求,其内容类型标头设置为“application/json”和 JSON 正文:

{
    "Value": "cat"
}

这可能是什么原因造成的?

标签: c#asp.net-corepostasp.net-core-mvcdeserialization

解决方案


就我而言,我错过了 json 格式化程序:

services.AddMvcCore().AddJsonFormatters();

也许它可以帮助某人。


推荐阅读