Веб-сервис ASP.NET ошибочно возвращает XML вместо JSON - PullRequest
3 голосов
/ 30 января 2011

Я пытаюсь использовать веб-сервис ASMX из javascript, используя jQuery.Он прекрасно работает, когда я запрашиваю XML, но я хочу использовать функцию сериализации JSON .net;(меня также начинает беспокоить, что это не работает)

Код для веб-службы:

using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Web.Script.Services;

[WebService()]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class SimpleService : WebService
{
    [WebMethod]
    public String GetString()
    {
        return "value";
    }
}

Код для клиента:

$.ajax({
  type: "POST",
  url: "SimpleService.asmx/GetString",
  data: "{}",
  contentType: "application/json; charset=utf-8",
  dataType: "json"
});

И ответ ...

Content-Type: text/xml; charset=utf-8
Server: Microsoft-IIS/7.5
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET

<?xml version="1.0" encoding="utf-8"?><string xmlns="http://tempuri.org/">value</string>

Запрос всегда выполняется успешно, но jQuery выдает ошибку синтаксического анализатора (что неудивительно, учитывая ответ).

Я сошел с ума,Я попытался добавить атрибут ServiceMethod с параметром ResponseType, установленным в JSON, но, похоже, ничего не работает.

Я также не хочу использовать генератор JavaScript .NET ScriptManager, поэтому, пожалуйста, не предлагайте их использовать.

Ответы [ 3 ]

3 голосов
/ 18 сентября 2013

Нет ответа на SO помог мне решить эту проблему.Вместо этого я нашел 2 статьи, описывающие эту проблему.

jQuery не кодирует данные запроса в JSON, а в строку запроса.Это приводит к тому, что ASP.NET игнорирует заголовок Accept и отвечает XML.

Проверьте эту статью на заголовок "JSON, объекты и строки: oh my!".

Здесь я цитирую:

$.ajax({
    type: "POST",
    url: "WebService.asmx/WebMethodName",
    <strong>data: {'fname':'dave', 'lname':'ward'},</strong>
    contentType: "application/json; charset=utf-8",
    dataType: "json"
});

Поскольку этот параметр данных является допустимым литералом объекта, вызов веб-службы таким способом не вызовет ошибок JavaScript нана стороне клиента.К сожалению, желаемого результата тоже не будет.

fname=dave&lname=ward

Это явно не то, что мы хотим, чтобы произошло.Решение состоит в том, чтобы убедиться, что вы передаете jQuery строку для параметра данных, например:

$.ajax({
    type: "POST",
    url: "WebService.asmx/WebMethodName",
    <strong>data: "{'fname':'dave', 'lname':'ward'}",</strong>
    contentType: "application/json; charset=utf-8",
    dataType: "json"
   });

Это небольшое изменение в синтаксисе, но оно имеет все значение.Теперь jQuery оставит наш объект JSON в одиночку и передаст всю строку в ASP.NET для анализа на стороне сервера.

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

data: JSON.stringify({'fname':'dave', 'lname':'ward'}),

Получение ASP.NET ScriptService для возврата JSON при запросах из jQuery очень сложно, и многие параметры в вашем коде могут заставить его генерировать XML вместо JSON.Вы должны прочитать различные SO Q / A, чтобы получить удовлетворение.

Связанная статья от того же автора , которая может дать больше рекомендаций.

2 голосов
/ 30 января 2011

Это ошибка пользователя.

Я только что натолкнулся на этот другой вопрос:

Подобное решение оказалось тем, что мне было нужно. Файл web.config имел отображение httpHandler для ScriptHandlerFactory для IIS6, и я использовал IIS7. Добавление отображения httpHandler в раздел IIS7 файла web.config решило проблему.

Я ненавижу скрытые движущиеся части ....

0 голосов
/ 30 января 2011

Попробуйте добавить атрибут [ScriptMethod] в метод:

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public String GetString()
...