ASP.NET MVC4 Web API MediaTypeFormatter Конвертер для преобразования XElement в JSON - PullRequest
2 голосов
/ 06 марта 2012

Я создаю API в ASP.NET MVC4 Web API, и одно из моих действий возвращает XML (в настоящее время в форме XElement).У меня нет контроля над данными, я просто передаю их.Нет никакого стандартного объекта, к которому я могу десериализовать его.

public Task<XElement> Get( string queryName, string query )...

Что я хочу сделать, это использовать MediaTypeFormatter, чтобы преобразовать его в JSON, если он запрашивается как таковой.Я начал писать MediaTypeFormatter и подключил его, но когда я вызываю «Get» на контроллере, он вызывает

protected override bool CanWriteType( Type type )
{
    return true;
}

в MediaTypeFormatter, но никогда не достигает уровня OnWriteToStreamAsync.В результате получается только XML в виде строки, например

"<testXmlHere\/>"

Кто-нибудь знает, как это исправить?

Спасибо

Ответы [ 4 ]

2 голосов
/ 06 марта 2012

Ваш пользовательский форматтер, вероятно, вставлен в список форматеров после JsonMediaTypeFormatter в коллекции форматеров.Этот форматировщик может написать XElement, и он делает это, записывая представление XML в виде строки JSON (хорошая или плохая идея - это другое обсуждение).При добавлении средства форматирования в коллекцию используйте метод Insert вместо Add:

GlobalConfiguration.Configuration.Formatters.Insert(
    0, new MyCustomMediaTypeFormatter());
0 голосов
/ 02 апреля 2012

MVC4 Быстрый совет № 3 - Удаление XML Formatter из ASP.Net Web API

в Global.asax: добавить строку:

GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();

вроде так:

        protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);

        BundleTable.Bundles.RegisterTemplateBundles();
        GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
    }
0 голосов
/ 02 апреля 2012
    public HttpResponseMessage<SensorUpdate> Post(int id)
    {
        SensorUpdate su = new SensorUpdate();
        su.Id = 12345;            
        su.Username = "SensorUpdateUsername";
        su.Text = "SensorUpdateText";
        su.Published = DateTime.Now;


        HttpResponseMessage<SensorUpdate> response = new HttpResponseMessage<SensorUpdate>(su, 
                    new MediaTypeHeaderValue("application/json"));

        return response;
    }
0 голосов
/ 06 марта 2012

Вот дикое предложение ... Сначала создайте сообщение HttpResonponse и установите для содержимого те данные, которые вы извлекаете. Попробуйте создать настраиваемый фильтр действий (System.Web.HttpFilters.ActionFilterAttribute) и реализовать метод OnActionExecuted.

В вашем методе получите соответствующие объекты HttpRequest и HttpResponse из HttpActionExecutedContext. Вы можете получить заголовок Accept из HttpRequest, а ваши данные - из HttpResponse. При необходимости отформатируйте данные на основе заголовка Accept для запроса и переназначьте его на содержимое Response.

Ты понял, откуда я иду ??

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...