Как позволить файлу ASMX выводить JSON - PullRequest
62 голосов
/ 17 октября 2008

Я создал файл ASMX с кодом позади файла. Работает нормально, но выводит XML.

Однако мне нужно, чтобы он выводил JSON. Конфигурация ResponseFormat, похоже, не работает. Мой код-это:

[System.Web.Script.Services.ScriptService]
public class _default : System.Web.Services.WebService {
    [WebMethod]
    [ScriptMethod(UseHttpGet = true,ResponseFormat = ResponseFormat.Json)]
    public string[] UserDetails()
    {
        return new string[] { "abc", "def" };
    }
}

Ответы [ 6 ]

53 голосов
/ 22 ноября 2012

Чтобы получить чистую строку JSON, без ее преобразования в XML, необходимо записать строку JSON непосредственно в HttpResponse и изменить тип возвращаемого значения WebMethod на void.

    [System.Web.Script.Services.ScriptService]
    public class WebServiceClass : System.Web.Services.WebService {
        [WebMethod]
        public void WebMethodName()
        {
            HttpContext.Current.Response.Write("{property: value}");
        }
    }
39 голосов
/ 17 октября 2008

С WebService возвращает XML, даже если для ResponseFormat задано значение JSON :

Убедитесь, что запрос является запросом POST, а не GET. У Скотта Гатри есть пост , объясняющий, почему .

Хотя он написан специально для jQuery, это также может быть полезно для вас:
Использование jQuery для использования веб-служб JSON ASP.NET

15 голосов
/ 18 апреля 2012

Это, вероятно, старые новости на данный момент, но магия выглядит так:

  • Атрибут [ScriptService] в классе веб-службы
  • [ScriptMethod (UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] для метода
  • Тип контента: application / json в запросе

С этими частями GET-запрос выполняется успешно.

Для HTTP POST

  • [ScriptMethod (UseHttpGet = false, ResponseFormat = ResponseFormat.Json)] для метода

и на стороне клиента (при условии, что ваш веб-метод называется MethodName и он принимает единственный параметр с именем searchString):

        $.ajax({
            url: "MyWebService.asmx/MethodName",
            type: "POST",
            contentType: "application/json",
            data: JSON.stringify({ searchString: q }),
            success: function (response) {                  
            },
            error: function (jqXHR, textStatus, errorThrown) {
                alert(textStatus + ": " + jqXHR.responseText);
            }
        });
9 голосов
/ 22 октября 2008

Быстрый способ, который я усвоил трудным путем (в основном потратив 4 часа на Google), вы можете использовать PageMethods в вашем ASPX-файле, чтобы вернуть JSON (с маркером [ScriptMethod ()]) для статического метода, однако, если вы решите переместить ваши статические методы в файл asmx, это не может быть статический метод.

Кроме того, вы должны сообщить веб-службе Content-Type: application / json, чтобы получить JSON от вызова (я использую jQuery и статью 3, которых следует избегать при использовании jQuery ). было очень поучительно - это с того же сайта, который упоминается в другом ответе здесь).

4 голосов
/ 17 октября 2008

Вы вызываете веб-сервис из клиентского скрипта или со стороны сервера?

Может помочь отправка заголовка типа контента на сервер, например,

применение / JSON; кодировка = UTF-8'

На стороне клиента я использую прототип библиотеки на стороне клиента, и при выполнении вызова Ajax есть параметр contentType, в котором вы можете указать это. Я думаю, что в jQuery есть метод getJSON.

3 голосов
/ 11 сентября 2012

Альтернатива: используйте общий обработчик HTTP (.ashx) и используйте вашу любимую библиотеку json для ручной сериализации и десериализации вашего JSON.

Я обнаружил, что полный контроль над обработкой запроса и генерацией ответа превосходит все, что предлагает .NET для простых веб-служб RESTful.

...