ASP.NET Web API XmlMediaTypeFormatter 未在未知元素上给出错误

ASP.NET Web API XmlMediaTypeFormatter not giving error on unknown element

如果我收到 XML 存在未知元素、属性等,我想发回 BadRequest。

我的 WebApiConfig 中有以下设置

 config.Formatters.Clear();

config.Formatters.Add(new JsonMediaTypeFormatter());
config.Formatters.Add(new CustomXmlMediaTypeFormatter());

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

config.Formatters.XmlFormatter.UseXmlSerializer = true;

我通过设置缺少的成员处理程序设法为 JSON 请求实现了这一点,但是我如何通过 XML 请求实现同样的事情?

我的模型只是简单直接的模型,没有任何装饰。

public class Address
{        
    public string AddressId { get; set; }
    ....
}

我的控制器动作是

[HttpPost]
[Route("")]
public IHttpActionResult Create(Address address){
   ...
}

如果xml是通过它发送的

<Address>
   <AddressId>myaddressid</AddressId>
   <UnknownElement>whatamidoing</UnknownElement>
</Address>

我想让它出错,这样我就可以发回错误的请求响应。 目前我没有收到任何错误,模型状态有效。

最后做了以下事情:

1 - 创建自定义 XmlMediaTypeFormatter 覆盖 CreateXmlSerializer 方法

public class CustomXmlMediaTypeFormatter : XmlMediaTypeFormatter
{
    public override XmlSerializer CreateXmlSerializer(Type type)
    {
        var serializer = new XmlSerializer(type);
        serializer.UnknownAttribute += (sender, args) => throw new Exception(args.ExpectedAttributes);
        serializer.UnknownElement += (sender, args) => throw new Exception(args.ExpectedElements);
        serializer.UnknownNode += (sender, args) => throw new Exception(args.Name);

        return serializer;
    }
}

我在 'Unknown' 元素等上抛出错误,以便 XmlMediaTypeFormatter 中的默认代码将这些作为错误添加到 ModelState。

2 - 设置 Api 应用程序以使用我的自定义实现

config.Formatters.Add(new CustomXmlMediaTypeFormatter());
config.Formatters.XmlFormatter.UseXmlSerializer = true;

3 - 查看 Controller/Action 中的 ModelState 以查看是否有异常错误 - 这些是由反序列化问题引起的错误

if (!ModelState.IsValid && ModelState.Values.Any(i => i.Errors.Any(j => j.Exception != null)))
{
    return BadRequest("Badly formatted request");
}