【问题标题】:C# WebAPI 2 Deserialization Produces Nulls but No ExceptionC# WebAPI 2 反序列化产生空值但没有异常
【发布时间】:2017-05-22 19:14:56
【问题描述】:

我正在使用 WebAPI 2 / Newtonsoft.Json 9.0.1 并且遇到了反序列化问题。我有一个将 DTO 作为其唯一参数的端点。调用该方法时,只有一个 DTO 属性被反序列化,其余属性为空值或默认值。该问题是由类型是接口而不是具体类型的嵌套属性引起的。这与 here 报告的问题相同。

我知道我可以通过将类型更改为具体类型或向现有接口属性添加类型初始化器来解决此问题,如下所示:

IAddressDTO Address { get; set; } = new AddressDTO();

我的问题是:为什么在反序列化期间没有抛出 .NET 异常/错误? 如果反序列化有问题,我想在运行时知道,而不是仅仅使用“null” “无处不在。这给我在生产环境中造成了一个巨大的问题,如果按照我的预期抛出异常,这是可以避免的。

如果我创建如下所示的单元测试,它确实会引发异常。 WebAPI 如何/为什么吞下这个异常,我如何让它停止这样做?我需要自定义过滤器或其他东西吗?这似乎应该是默认行为。

这是一个 NUnit 测试,它在运行 WebAPI 端点时确实会引发我希望看到的异常。

[Test]
public void DeserializationIssue()
{
    string json = @"{
        ""OrderNumber"":155,
        ""Person"":{
            ""FirstName"":""AAAA"",
            ""LastName"":""B"",
            ""Address"":{
                ""line1"":""1234 Easy St"",
            }
        }
    }";
    PatientDTO patientDTO = JsonConvert.DeserializeObject<PatientDTO>(json);
    Assert.That(patientDTO.Person.Address.Line1, Is.EqualTo("1234 Easy St"));
}

【问题讨论】:

标签: c# json serialization asp.net-web-api2


【解决方案1】:

RE:为什么在反序列化过程中没有抛出 .NET 异常/错误?

我敢打赌,异常正在发生,而您只是没有设置好检测它。有关 webapi 和全局异常处理的信息,请参阅此人工:https://docs.microsoft.com/en-us/aspnet/web-api/overview/error-handling/web-api-global-error-handling

如果数据有问题,并且您知道反序列化可能会失败,您可能希望将其包装在 try/catch 中并采取适当的措施。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-26
    • 2015-05-04
    • 2015-09-20
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    相关资源
    最近更新 更多