2008-10-17 2 views
59

Я создал файл ASMX с кодом за файлом. Он работает нормально, но выводит XML.Как разрешить выход ASMX-файла JSON

Однако мне нужно это для вывода 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" }; 
    } 
} 
+0

Возможный дубликат [веб-службы ASMX, как вернуть JSON без XML-обертке?] (Https://stackoverflow.com/questions/14950578/asmx-web-service-how-to-return-json- без-XML-обертке) – 2018-02-21 12:42:59

ответ

40

От WebService returns XML even when ResponseFormat set to JSON:

Убедитесь, что запрос является запросом POST, а не GET. У Скотта Гатри есть post explaining why.

Хотя она написана специально для JQuery, это также может быть полезным для Вас:
Using jQuery to Consume ASP.NET JSON Web Services

+7

в качестве альтернативы вы можете также добавить следующую аннотацию [ScriptMethod (UseHttpGet = верно, ResponseFormat = ResponseFormat.Json)] публичная строка TestData() для того, чтобы получить в вашем веб-сервисов – 2012-03-06 21:21:00

+1

Wow , Кто бы мог предположить, что вы не смогли получить ответ «JSON» с запросом «GET». Невероятно. Спасибо за это - я рвал волосы! – crush 2014-01-14 14:37:02

+3

Я не согласен с тем, что здесь подходит POST-запрос. Конечная точка не ожидает данных, и OP не отправляет какие-либо данные на сервер (в отличие от сообщения Скотта G) и, конечно, не собирается изменять данные на сервере. Фактически OP имеет правильный атрибут ScriptMethod, чтобы разрешить запрос GET - UseHttpGet = true. Они просто ссылаются на конечную точку, чтобы «получить» некоторые данные. Запрос GET в порядке - все, что не хватает, заключается в настройке Content-Type в запросе, см. Мой ответ ниже. – bitsprint 2014-01-20 15:35:19

4

Вы вызова веб-службы из клиентского сценария или на стороне сервера?

Возможно, отправка заголовка типа содержимого на сервер поможет, например.

'application/json; charset = utf-8 '

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

9

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

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

12

Это, вероятно, старые новости теперь, но магия, кажется:

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

с этими частями в месте, запрос GET успешно

3

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

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

51

Чтобы получить чистую строку 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}"); 
     } 
    }