【问题标题】:POST object in .NET WebAPI.NET WebAPI 中的 POST 对象
【发布时间】:2013-04-03 14:32:44
【问题描述】:

我对 WebApi 有一个小问题。

问题: 如果我想使用 JSON 发布模型,我可以添加任意数量的成员,只要模型中定义的成员存在。

问题: 如果我的 Json 对象中存在未定义的成员,我如何触发异常。如果没有自定义 JsonConverter,这可以实现吗? 我正在寻找的是通用解决方案,而不是针对每个不同模型的转换。

示例

型号:

public class Person
{
    [Required]
    public string Name { get; set; }
}

API 控制器:

public class PersonController : ApiController
{
    public HttpResponseMessage Post(Person person)
    {
        if (person != null)
        {
            if (ModelState.IsValid)
            {
                //do some stuff
                return new HttpResponseMessage(HttpStatusCode.OK);
            }
        }
        return new HttpResponseMessage(HttpStatusCode.BadRequest);

    }
}

Json 帖子(正文) {"Name":"Joe"} --> 有效 {"Name":"Joe","InvalidMember","test","Name","John"} --> 也有效。在这种情况下,我想触发一个异常。因为如果你看它,它与我的模型定义不完全匹配。

【问题讨论】:

  • 确实,这不是一个真正的问题,但我想强制我的客户使用所描述的 API,而不是用无用的信息填充它。它只是消耗带宽。如果 API 没有造成问题,客户端会不断发布额外的数据,甚至可能都不知道。
  • 发布额外数据仍然会消耗带宽。在您检查其结构时,数据已经传输到服务器。不确定您是否试图阻止发布额外的数据。在这种情况下,您必须在客户端解决问题。
  • 是的,我知道。我想要的只是让客户知道发布额外的数据,仅此而已。 “嘿,你发布了我不需要的数据。清理你的帖子,然后再试一次”。如果忽略多余的数据,客户端会继续发布,从而导致不必要的网络流量。

标签: c# asp.net-web-api


【解决方案1】:

您可以尝试使用此设置:

config.Formatters.JsonFormatter.SerializerSettings.MissingMemberHandling = MissingMemberHandling.Error;

当存在 JSON 中无法识别的额外属性时,它应该为您提供无效的模型状态。

【讨论】:

  • 这个命名似乎违反直觉,我原以为它是针对 under 的发布场景(JSON 中缺少成员),而不是 over-posting(对象定义中缺少成员)。但是关于它的文档非常清楚:“获取或设置在反序列化期间如何处理丢失的成员(例如 JSON 包含不是对象上的成员的属性)。” - james.newtonking.com/projects/json/help/index.html?topic=html/…
  • 谢谢。这解决了我的问题。我知道这个设置存在,但我假设它只处理欠贴。经验教训:永远不要假设任何事情;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-05
相关资源
最近更新 更多