2014-12-05 3 views
4

Может ли кто-нибудь объяснить мне, как ASP.NET обрабатывает преобразование из объекта класса в объект JSON в WebMethods?WebMethod автоматически возвращает объект класса как JSON

Например, вы следующий WebMethod, который возвращает объект Person:

[WebMethod] 
    public static Person GetPerson() 
    { 
     Person p = new Person() 
     { 
      Id = 1, 
      Name = "Test" 
     }; 

     return p; 
    } 

В моей JQuery, где я называю WebMethod я получаю ответ, который содержит из объекта JSON.

Как ASP.NET сделал это автоматически? Использует ли он класс JavaScriptSerializer?

Также вы видите множество примеров использования конвертеров JSON для преобразования объекта класса в объект json. Почему это? Это из-за класса JavaScriptSerializer, который он использует, и его плохой производительности или ...?

+1

Боковое примечание: 'WebMethod' больше не поддерживается. Если вам нужен API, основанный на JSON или XML, лучше всего взглянуть на [ASP.NET Web API] (http://www.asp.net/web-api), который использует Json.NET Newtonsoft для обработки сериализации JSON. – mason

+0

Я использую ASP.NET Webforms, где у меня есть некоторые вызовы ajax, могу ли я использовать веб-API внутри моего проекта webforms? – Mivaweb

+0

Да! Вы, конечно, можете. У Microsoft есть эта инициатива под названием [Один ASP.NET] (http://channel9.msdn.com/Events/Visual-Studio/Launch-2013/WC103). В основном все службы должны получать те же функции (где это применимо), и вы можете смешивать и сопоставлять свои проекты. Я фактически начал использовать веб-API с веб-формами, хотя теперь я изучаю MVC. Это в основном так же просто, как добавление пакета NuGet, настройка некоторой маршрутизации, тогда вы можете практически скопировать код веб-метода в функцию веб-API. См. Ссылку в моем первом комментарии для начала шагов. – mason

ответ

3

Как это сделать ASP.NET автоматически?

В основном есть некоторый код, сидя между полотном и WebMethod, который принимает запрос, выясняет, что он просит, находит ваш WebMethod и получает результат, а затем упорядочивает его обратно клиенту на основе приемлемых форматов в заголовок запроса.

Использует ли он класс JavaScriptSerializer?

Возможно. Я не мог найти что-либо там, где это было сказано. Но он не использует стороннюю библиотеку. Поскольку это один из них встроен, это хорошее предположение.

Также вы видите множество примеров использования конвертеров JSON для преобразования объекта класса в объект json. Почему это? Это из-за используемого класса JavaScriptSerializer и его плохой производительности или ...?

Технология WebMethod может быть очень тонкой и иногда отказываться возвращать JSON, несмотря на принятые заголовки. Один из способов это сделать что-то вроде этого:

[WebMethod] 
public static void GetPerson() 
{ 
    Person p = new Person() 
    { 
     Id = 1, 
     Name = "Test" 
    }; 
    HttpContext.Current.Response.ResponseType = "application/json"; 
    HttpContext.Current.Response.Write(JsonConvert.SerializeObject(p)); 
    HttpContext.Current.Response.End(); 
} 

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

+0

Вы говорите: «Техника WebMethod может быть очень тонкой и иногда отказывается возвращать JSON'. Включает ли это другие библиотеки конверсий, такие как JSON.NET? – Mivaweb

+0

Когда я сказал, отказываюсь возвращать JSON, я имею в виду, что он игнорирует заголовки запросов и сериализуется как XML вместо этого. Это не имеет никакого отношения к тому, какой сериализатор JSON вы используете, он имеет все, что связано с тем, как реализация WebMethod кодируется за кулисами. – mason

+0

Итак, чтобы сделать его короче, создание WebMethods без возвращаемого типа и запись вашего результата обратно на responseestream с помощью конвертера - лучшая практика. Или используя веб-API ASP.NET? – Mivaweb

Смежные вопросы