Como retornar o JSON de um serviço da web 2.0 asmx

Eu estou usando .net framework 2.0 / jQuery para fazer uma chamada Ajax para um serviço da web 2.0. Não importa para o que eu defino o contentType na chamada ajax, o serviço sempre retorna XML. Eu quero que ele retorne Json!

Aqui está a binding:

$(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 
. $('#RSSContent').html(msg.d); } }); });

Aqui está o header do pedido no 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 

Eu tentei definir o contentType para ‘text / json’ e obter os mesmos resultados.

Aqui está o método de serviço da web:

  _ 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 

e aqui está o que ele retorna:

  {"DateTime":"11/13/2008 6:04:22 PM"} 

Alguém sabe como forçar o serviço web para retornar Json quando eu peço Json?

Por favor, não me diga para atualizar para o .Net Framework 3.5 ou qualquer coisa assim (eu não sou tão estúpido). Eu preciso de uma solução 2.0.

Não é nenhum problema retornar o JSON dos serviços ASMX no ASP.NET 2.0 . Você só precisa do ASP.NET AJAX Extensions instalado.

Não se esqueça de adicionar a decoração [ScriptService] ao seu serviço da web. Isso é o que instrui a parte do servidor da estrutura do ASP.NET AJAX a retornar o JSON para uma solicitação formada adequadamente.

Além disso, você precisará soltar o “.d” de “msg.d” no meu exemplo, se você estiver usando com o 2.0. O “.d” é um recurso de segurança que vem com o 3.5 .

A resposta é envolvida em um elemento porque o método diz que ele retornará uma string. Você poderia usar isto para poder enviar json simples, mas seu wsdl será enganado (a function é inválida, mas responde aos dados).

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

Boa sorte tom

Btw: veja Newtonsoft.Json para JsonConvert

Você precisa decorar seu método da web com o seguinte:

 [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 

Você tem o resto certo 🙂

Mais informações no blog de Encosia e Andrew Roland

EDIT: Como observado abaixo, este é apenas o .net 3.5 (eu não sabia disso, meu mau).

Você provavelmente não pode fazer nada além de XML ou serialização binária no .NET 2.0. Se você não estiver usando uma referência da Web gerada automaticamente, não se preocupe com o ASMX. Basta usar um ASPX ou ASHX.

Você pode usar a biblioteca Jayrock Início rápido para asp.net

Isso permite que você escreva um manipulador http para retornar seu 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!"; } } } 

Também é possível escrever seu próprio conversor JSON rápido usando 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("}") 

Eu posso não estar 100% correto sobre isso, mas tenho certeza que os serviços web da .net são baseados em XML / SOAP.

Você precisaria sobrescrever o comportamento padrão do webservice. Não tenho certeza absoluta de que isso seria possível.

Eu sei que esta não será a resposta mais útil, mas pode levá-lo na direção certa.