对象反序列化在 Asp Net Core MVC 控制器中的 POST 失败

Posted

技术标签:

【中文标题】对象反序列化在 Asp Net Core MVC 控制器中的 POST 失败【英文标题】:Object deserialization fails POST in Asp Net Core MVC Controller 【发布时间】:2021-03-12 08:41:53 【问题描述】:

我创建了一个没有完整 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 类和一个测试控制器: 内部类启动 公共 IConfiguration 配置 获取; 公共无效配置服务(IServiceCollection 服务) services.AddMvcCore(); 公共无效配置(IApplicationBuilder 应用程序,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"

这可能是什么原因?

【问题讨论】:

错误是在您发送服务器的请求中,而不是在作为响应的客户端的控制器中。服务器不喜欢请求的格式并返回错误消息。然后在您的客户端中,当您处理失败的错误消息时。解决方案是修复请求,而不是响应。 @jdweng 感谢您的回复。但是,这是一个非常简单的 POST 请求。我不确定请求中可能出了什么问题。 (我用示例请求更新了问题) 请求的格式取决于服务器的要求。我们不知道服务器要求,如果两个请求有效而第三个请求无效,那么您不符合服务器要求,我们无能为力。 是的,但是对于其他 2 个请求,没有正文。因此,这也可能是与反序列化有关的问题 没有。这是一个内部服务器错误。所以要么服务器不想要正文,要么正文格式不正确。 【参考方案1】:

就我而言,我缺少 json 格式化程序:

services.AddMvcCore().AddJsonFormatters();

也许它对某人有帮助。

【讨论】:

以上是关于对象反序列化在 Asp Net Core MVC 控制器中的 POST 失败的主要内容,如果未能解决你的问题,请参考以下文章

将 JSON 发布到 ASP.NET MVC 可空短属性

当我尝试在 .NET Core 中反序列化 FormFile 对象时,为啥会出现奇怪的异常?

ASP.NET Core中如何使用缓存

asp.net core 使用protobuf

在 C# ASP NET Core 中使用 JSON 而无需反序列化

ASP.Net Core 中的 JSON 序列化/反序列化