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");
}
如果我收到 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");
}