class Person
{
public string Name {get;set;}
public DateTime CreateDate {get;set;}
}
Клиент посылает в метод данные в виде XML. Если по какой то причине WEB API не может преобразовать XML в объект класса Person то на входе в метод мы имеем NULL. А можно как то в методе узнать почему параметр NULL? Что конкретно не понравилось?
olegy wrote: ↑20 Apr 2017 04:34
В Fiddler посмотрите raw request.
Обычно не проставлен request header Content-Type - должен быть text/xml или application/xml
Этот хедер проставлен.
Но причина того, что параметр = null может быть другой. Допустим пользователь внутри XML передал дату в неправильном формате. Задача собственно стоит в том, чтобы внутри моего метода (ну или в любом месте кода моего) узнать причину этого, что пошло не так. Чтобы вернуть клиенту ответку Bad request но при этом указать ему, что он сделал не так.
shadow7256 wrote: ↑20 Apr 2017 12:08
Этот хедер проставлен.
Но причина того, что параметр = null может быть другой. Допустим пользователь внутри XML передал дату в неправильном формате. Задача собственно стоит в том, чтобы внутри моего метода (ну или в любом месте кода моего) узнать причину этого, что пошло не так. Чтобы вернуть клиенту ответку Bad request но при этом указать ему, что он сделал не так.
Тогда варианта два.
Первый - сложный - подключить custom httpmodule (или owin middleware - зависит от импементации) и перехватить запрос до того как он попал в controller и, в случае ошибки, просигналить ответ.
Вариант два - смените подпись метода на
public void CreatePerson ([FromBody] string whatever);
и ручками deserialize строку в объект. Глядишь, ошибки и повываливаются
olegy wrote: ↑20 Apr 2017 16:03
Вариант два - смените подпись метода на
public void CreatePerson ([FromBody] string whatever);
и ручками deserialize строку в объект. Глядишь, ошибки и повываливаются
интересно.. то есть на входе получаем чисто XML в виде строки. Затем сами внутри того же try/catch пытаемся создать объекта класса Person на его основе.. и тут может вывалиться хахашечка
olegy wrote: ↑20 Apr 2017 16:03
Вариант два - смените подпись метода на
public void CreatePerson ([FromBody] string whatever);
и ручками deserialize строку в объект. Глядишь, ошибки и повываливаются
интересно.. то есть на входе получаем чисто XML в виде строки. Затем сами внутри того же try/catch пытаемся создать объекта класса Person на его основе.. и тут может вывалиться хахашечка
Попробую.
Мужики это что за такие древние технологии вы тут обсуждаете?
почему нельзя просто дебагером пройтись и посмотреть?
olegy wrote: ↑20 Apr 2017 16:03
Вариант два - смените подпись метода на
public void CreatePerson ([FromBody] string whatever);
и ручками deserialize строку в объект. Глядишь, ошибки и повываливаются
интересно.. то есть на входе получаем чисто XML в виде строки. Затем сами внутри того же try/catch пытаемся создать объекта класса Person на его основе.. и тут может вывалиться хахашечка
Попробую.
Мужики это что за такие древние технологии вы тут обсуждаете?
почему нельзя просто дебагером пройтись и посмотреть?
где ставить брэк-поинт, чтобы узнать почему model is not properly populated?
public ActionResult Index(SuperModel model)
{
ProcessModel(model);
olegy wrote: ↑20 Apr 2017 16:03
Вариант два - смените подпись метода на
public void CreatePerson ([FromBody] string whatever);
и ручками deserialize строку в объект. Глядишь, ошибки и повываливаются
интересно.. то есть на входе получаем чисто XML в виде строки. Затем сами внутри того же try/catch пытаемся создать объекта класса Person на его основе.. и тут может вывалиться хахашечка
Попробую.
Мужики это что за такие древние технологии вы тут обсуждаете?
почему нельзя просто дебагером пройтись и посмотреть?
где ставить брэк-поинт, чтобы узнать почему model is not properly populated?
public ActionResult Index(SuperModel model)
{
ProcessModel(model);
return View();
}
так что за язык/технология?
в яве/idea/eclipse я бы поставил на return View();
и далее опустился бы по стэку до того места где эта модель заполняется.
там где то обязан быть конвертер/mapper
valchkou wrote: ↑24 Apr 2017 18:50
так что за язык/технология?
имеем метод в WEB API.
похоже .net..
valchkou wrote: ↑24 Apr 2017 18:50
в яве/idea/eclipse я бы поставил на return View();
и далее опустился бы по стэку до того места где эта модель заполняется.
там где то обязан быть конвертер/mapper
when we hit return View();
the initialization of the model already complete.. как вы отмотаете назад?
eclipse позволяет такое?
olegy wrote: ↑20 Apr 2017 16:03
Вариант два - смените подпись метода на
public void CreatePerson ([FromBody] string whatever);
и ручками deserialize строку в объект. Глядишь, ошибки и повываливаются
интересно.. то есть на входе получаем чисто XML в виде строки. Затем сами внутри того же try/catch пытаемся создать объекта класса Person на его основе.. и тут может вывалиться хахашечка
Попробую.
Да. Но если делать так то как минимум один минус есть - документация сервиса не будет работать.
valchkou wrote: ↑24 Apr 2017 18:50
так что за язык/технология?
имеем метод в WEB API.
похоже .net..
valchkou wrote: ↑24 Apr 2017 18:50
в яве/idea/eclipse я бы поставил на return View();
и далее опустился бы по стэку до того места где эта модель заполняется.
там где то обязан быть конвертер/mapper
when we hit return View();
the initialization of the model already complete.. как вы отмотаете назад?
eclipse позволяет такое?
да, дебагер next step/step out выйдет из метода Index() во внешний метод, который вызвал Index() и так далее.
shadow7256 wrote: ↑21 Apr 2017 00:48
интересно.. то есть на входе получаем чисто XML в виде строки. Затем сами внутри того же try/catch пытаемся создать объекта класса Person на его основе.. и тут может вывалиться хахашечка
olegy wrote: ↑20 Apr 2017 16:03
Вариант два - смените подпись метода на
public void CreatePerson ([FromBody] string whatever);
и ручками deserialize строку в объект. Глядишь, ошибки и повываливаются
интересно.. то есть на входе получаем чисто XML в виде строки. Затем сами внутри того же try/catch пытаемся создать объекта класса Person на его основе.. и тут может вывалиться хахашечка
Попробую.
Да. Но если делать так то как минимум один минус есть - документация сервиса не будет работать.
Хм. не уверен про какую документацию сервиса ты говоришь
я по просьбе партии сделал один метод, который возвращает все доступные методы в моем WEB API и показывает какие параметры надо передавать и что эти методы возвращают. Партии этого хватило вполне
valchkou wrote: ↑24 Apr 2017 18:50
так что за язык/технология?
имеем метод в WEB API.
похоже .net..
valchkou wrote: ↑24 Apr 2017 18:50
в яве/idea/eclipse я бы поставил на return View();
и далее опустился бы по стэку до того места где эта модель заполняется.
там где то обязан быть конвертер/mapper
when we hit return View();
the initialization of the model already complete.. как вы отмотаете назад?
eclipse позволяет такое?
да, дебагер next step/step out выйдет из метода Index() во внешний метод, который вызвал Index() и так далее.
не уверен что Visual Studio позволяет такое... и да. Технология .NET.
Одно из полей класса Person было типа DateTime. Ну по совету бывалых я просто считал тупо строку и попытался преобразовать ее в объект Person через XmlSerializer. В ексепшене было это: The string '3/18/09 10:16 PM' is not a valid AllXsd value
начал копать. Оказывается , что если поле объекта имеет тип DateTime, то внутри XML его представление должно быть в строгом формате - yyyy-dd-mm что то типа такого.. любой другой формат тут же выдаст ошибку. Даже такой формат как mm/dd/yyyy тоже выплюнет ексепшн.