Веб-API ASP.NET XmlMediaTypeFormatter не выдает ошибку для неизвестного элемента - PullRequest
0 голосов
/ 11 октября 2018

Я хочу отправить BadRequest, если получаю XML с неизвестным элементом, атрибутом и т. Д.

У меня есть следующие настройки в моем 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 Ответ

0 голосов
/ 12 октября 2018

Закончилось следующим:

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;
    }
}

Я выкидываю ошибки на элементы «Неизвестно» и т. Д., Так что код по умолчаниюв XmlMediaTypeFormatter добавляет их как ошибки в ModelState.

2 - Установите приложение Api для использования моей пользовательской реализации

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

3 - Просмотрите ModelState в Controller / Action, чтобы увидетьесли есть ошибки с исключениями - это ошибки, вызванные проблемами десериализации

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