Как вернуть JSON из веб-службы 2.0 asmx

Я использую .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.

Ответ 1

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

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

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

Ответ 2

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

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

Удачи, Том

Btw: см. Newtonsoft.Json для JsonConvert

Ответ 3

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

[ScriptMethod(ResponseFormat = ResponseFormat.Json)]

У тебя все в порядке:)

Дополнительная информация на Encosia и Блог Andrew Roland

EDIT: Как отмечено ниже, это только .NET 3.5 (я не знал об этом, я плохой).

Ответ 4

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

Ответ 5

Вы можете использовать Jayrock library Быстрый старт для 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!";
        }
    }
}

Ответ 6

Также можно просто написать собственный быстрый конвертер 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 uneeded.
sb.Remove(sb.Length - 1, 1)

sb.Append("}")    

Ответ 7

Я не могу быть на это 100% прав, но я уверен. web-сервисы .net основаны на XML/SOAP.

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

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