Веб-API возвращает XML-контент

Веб-API:

 public int Post(MyModel m){
    return CreateTask(m);
 }

Возвращаемое значение:

Id:"<int xmlns="http://schemas.microsoft.com/2003/10/Serialization/">1446</int>"

Мой вопрос: почему веб-API возвращает идентификатор, как указано выше. Мне нужно, чтобы он был «1446». Как я могу избавиться от этой части xml?


person Sampath    schedule 30.09.2014    source источник
comment
Вы видели это: stackoverflow.com/questions/12590801/ Это также может быть полезно: -rest-api-what-returns-xml" title="проблемы с сериализацией webapi при использовании рекурсивного rest API, который возвращает xml">stackoverflow.com/questions/18390709/   -  person David Tansey    schedule 01.10.2014
comment
WebAPI ответит (обычно) возвратом xml или JSON клиенту. Если вам нужен другой тип ответа, вам нужно написать обработчик, который делает это. Но это, кажется, слишком усложняет ситуацию, имхо. Разве клиент не может просто принять JSON или xml? И преобразовать ответ в целое число?   -  person Håkan Fahlstedt    schedule 01.10.2014
comment
Просто чтобы уточнить ваш вопрос. Вы получаете xml, но хотите получить Json или вам просто нужна простая строка?   -  person Matthijs Wessels    schedule 01.10.2014


Ответы (3)


Проект WebApi настроен в файле Global.asax; именно там вы найдете класс с именем WebApiConfig. Внутри этого класса вы найдете «Media Formatters»; Media Formatters говорит, способен ли ваш WebApi сериализовать/десериализовать JSON System.Net.Http.Formatting.JsonMediaTypeFormatter(), XML или любой другой формат.

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
           //...

            System.Web.Http.GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
            config.Formatters.Insert(0, new System.Net.Http.Formatting.JsonMediaTypeFormatter());
            config.Formatters.Insert(0, new System.Net.Http.Formatting.FormUrlEncodedMediaTypeFormatter());


        }
    }

Если средство форматирования JSON является первым элементом в вашем списке, оно будет вашим сериализатором/десериализатором по умолчанию, чтобы получить доступ к любому другому формату, тип содержимого запроса должен явно указывать желаемый формат, если он поддерживается, он вернет его, а если нет. вернет его в формате по умолчанию.

Результат вывода, который вы видите, полностью зависит от десериализации/сериализации, которую использует выбранный форматировщик мультимедиа.

person Dalorzo    schedule 30.09.2014
comment
Отлично. Спасибо. Ваше решение работает. Но я хотел бы задать один вопрос. Несмотря на то, что без использования вышеуказанного средства форматирования json оно работало в большинстве случаев. Почему такое странное поведение? - person Sampath; 01.10.2014
comment
Единственное, что приходит мне на ум, что может изменить поведение, — это тип содержимого запроса. - person Dalorzo; 01.10.2014
comment
Да, понял. Большое спасибо за отличный ответ. :) - person Sampath; 01.10.2014
comment
Это вызовет проблемы позже, когда придет другой разработчик и будет ожидать, что WebAPI будет работать нормально. - person frenchie; 01.10.2014
comment
@frenchie, вы совершенно ошибаетесь в этом ... Как объясняется в моем посте, первый форматировщик мультимедиа используется по умолчанию, а другой будет работать на основе типа контента. Ваше понимание неправильности неверно. - person Dalorzo; 01.10.2014
comment
Вы имеете дело с изменением значения по умолчанию? - person frenchie; 01.10.2014
comment
@frenchie Опять же, вы ошибаетесь... Вы читали мой пост? Нет ничего плохого в том, чтобы изменить порядок средств форматирования мультимедиа или удалить ненужные, на самом деле лучше избегать проблем с неподдерживаемыми форматами. - person Dalorzo; 01.10.2014
comment
В любом случае, оба наших ответа работают, и ОП будет выбирать, исходя из того, что лучше всего подходит для него. - person frenchie; 01.10.2014

Если вы хотите вернуть только 1446, вам нужно вернуть HttpResponseMessage, например:

public HttpResponseMessage Post(Event_model event)
{

HttpResponseMessage TheHTTPResponse = new HttpResponseMessage();
TheHTTPResponse.StatusCode = System.Net.HttpStatusCode.OK;
TheHTTPResponse.Content = new StringContent(Event.CreateEvent(event).ToString(), Encoding.UTF8, "text");

return TheHTTPResponse;

}

Если вы измените конфигурацию глобально, это может вызвать проблемы при реализации веб-службы, которая должна возвращать другой формат. Возвращая HttpResponseMessage, вы можете просто беспокоиться о конкретном методе, с которым имеете дело.

person frenchie    schedule 30.09.2014
comment
вы совершенно неправы в этом... Как объясняется в моем посте, первый форматировщик мультимедиа используется по умолчанию, а другой будет работать на основе типа контента. Ваше понимание неправильного неправильно - person Dalorzo; 01.10.2014

В своем запросе установите для заголовка Accept значение application/json:

Accept: application/json
person Fordio    schedule 30.09.2014
comment
Он не упоминает об этом, кажется, он пытается избавиться от части xml. - person Fordio; 01.10.2014