Как вернуть JSON из веб-службы 2.0 asmx - PullRequest
27 голосов
/ 14 ноября 2008

Я использую .Net framework 2.0 / jQuery для вызова Ajax веб-службы 2.0. Независимо от того, что я установил для contentType в вызове ajax, сервис всегда возвращает XML. Я хочу вернуть Json!

Вот звонок:

      $(document).ready(function() {
         $.ajax({
            type: "POST",
            url: "DonationsService.asmx/GetDate",
            data: "{}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(msg) {
              // Hide the fake progress indicator graphic.
              $('#RSSContent').removeClass('loading');

              // Insert the returned HTML into the <div>.
              $('#RSSContent').html(msg.d);
            }
          });
        });    

Вот как выглядит заголовок запроса в Fiddler:

POST /DonationsService.asmx/GetDate HTTP/1.1
x-requested-with: XMLHttpRequest
Accept-Language: en-us
Referer: http://localhost:1238/text.htm
Accept: application/json, text/javascript, */*
Content-Type: application/json; charset=utf-8
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; eMusic DLM/4; .NET CLR 2.0.50727)
Host: localhost:1238
Content-Length: 2
Connection: Keep-Alive
Pragma: no-cache

Я попытался установить для contentType 'text / json' и получить те же результаты.

Вот метод веб-службы:

<WebMethod()> _
Public Function GetDate() As String

    'just playing around with Newtonsoft.Json
    Dim sb As New StringBuilder
    Dim sw As New IO.StringWriter(sb)
    Dim strOut As String = String.Empty

    Using jw As New JsonTextWriter(sw)
        With jw
            .WriteStartObject()
            .WritePropertyName("DateTime")
            .WriteValue(DateTime.Now.ToString)
            .WriteEndObject()
        End With
        strOut = sw.ToString
    End Using

    Return strOut

End Function

и вот что он возвращает:

<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://DMS.Webservices.org/">{"DateTime":"11/13/2008 6:04:22 PM"}</string>

Кто-нибудь знает, как заставить веб-сервис возвращать Json, когда я спрашиваю Json?

Пожалуйста, не говорите мне, чтобы я обновлялся до .Net Framework 3.5 или чего-то подобного (я не настолько глуп) Мне нужно решение 2.0.

Ответы [ 7 ]

35 голосов
/ 14 ноября 2008

Нет проблем с возвратом JSON из служб ASMX в ASP.NET 2.0 . Вам просто нужно установить расширения ASP.NET AJAX.

Обязательно добавьте украшение [ScriptService] в ваш веб-сервис. Вот что указывает серверной части ASP.NET AJAX-фреймворка возвращать JSON для правильно сформированного запроса.

Кроме того, вам нужно удалить «.d» из «msg.d» в моем примере, если вы используете его с 2.0. .d - это функция безопасности, которая поставляется с 3.5 .

11 голосов
/ 22 марта 2011

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

[WebMethod(Description="return pure JSON")]
public void retrieveByIdToPureJSON( int id )
{
  Context.Response.Write( JsonConvert.SerializeObject( mydbtable.getById(id) );
}

Удачи, Том

Кстати: см. Newtonsoft.Json для JsonConvert

10 голосов
/ 14 ноября 2008

Вам нужно украсить свой веб-метод следующим образом:

[ScriptMethod(ResponseFormat = ResponseFormat.Json)]

Вы правильно поняли все остальное :)

Больше информации на Encosia и Блог Эндрю Роланда

РЕДАКТИРОВАТЬ: Как отмечено ниже, это только .NET 3.5 (я не знал об этом, мой плохой).

2 голосов
/ 14 ноября 2008

Вы можете использовать библиотеку Jayrock Быстрый старт для asp.net

Это позволяет вам написать обработчик http, который вернет вам json.

<%@ WebHandler Class="JayrockWeb.HelloWorld" %>

namespace JayrockWeb
{
    using System;
    using System.Web;
    using Jayrock.Json;
    using Jayrock.JsonRpc;
    using Jayrock.JsonRpc.Web;

    public class HelloWorld : JsonRpcHandler
    {
        [ JsonRpcMethod("greetings") ]
        public string Greetings()
        {
            return "Welcome to Jayrock!";
        }
    }
}
2 голосов
/ 14 ноября 2008

Вы, вероятно, не можете делать ничего, кроме XML или двоичной сериализации в .NET 2.0. Если вы не используете автоматически сгенерированную веб-ссылку, не беспокойтесь о ASMX. Просто используйте вместо этого ASPX или ASHX.

1 голос
/ 29 июня 2011

Также можно просто написать свой собственный быстрый конвертер JSON, используя Refelction.

Dim sb As New StringBuilder("{")
For Each p As PropertyInfo In myObject.GetType().GetProperties()
    sb.Append(String.Format("""{0}"":""{1}"",", p.Name, p.GetValue(myObject,  
              Nothing).ToString()))
Next p

//remove the last "," because it's uneeded.
sb.Remove(sb.Length - 1, 1)

sb.Append("}")    
0 голосов
/ 14 ноября 2008

Возможно, я не на 100% прав, но я уверен, что .net веб-сервисы основаны на XML / SOAP.

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

Я знаю, что это будет не самый полезный ответ, но может направить вас в правильном направлении.

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