如何从2.0 asmx Web服务返回JSON

我使用.Net framework 2.0 / jQuery来对2.0 Web服务进行Ajax调用。 无论我在ajax调用中将contentType设置为什么,服务总是返回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 
. $('#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’并获得相同的结果。

这是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 

这是它的回报:

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

当我要求Json时,有谁知道如何强制Web服务返回Json?

请不要告诉我升级到.Net Framework 3.5或类似的东西(我不是那么愚蠢)。 我需要2.0解决方案。

从ASP.NET 2.0中的ASMX服务返回JSON没有问题。 您只需要安装ASP.NET AJAX Extensions。

务必将[ScriptService]装饰添加到Web服务中。 这就是指示ASP.NET AJAX框架的服务器端部分为正确形成的请求返回JSON的内容。

另外,如果你在2.0中使用它,你需要在我的例子中从“msg.d”中删除“.d”。 “.d”是3.5附带的安全function 。

响应包含在一个元素中,因为你的方法说它将返回一个字符串。 您可以使用它来发送普通的json,但是你的wsdl会被愚弄(函数是无效但确实响应数据)。

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

祝你好运,汤姆

顺便说一句:请参阅Newtonoft.Json获取JsonConvert

您需要使用以下内容装饰您的Web方法:

 [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 

你有其余的权利:)

更多信息在Encosia和Andrew Roland的博客上

编辑:如下所述这只是.NET 3.5(我没有意识到这一点,我的坏)。

除了.NET 2.0中的XML或二进制序列化之外,您可能无法执行任何操作。 如果您没有使用自动生成的Web引用,请不要使用ASMX。 只需使用ASPX或ASHX即可。

您可以使用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!"; } } } 

也可以使用Refelction编写自己的快速JSON转换器。

 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("}") 

我可能不是100%正确,但我确定.net webservices是基于XML / SOAP的。

您需要覆盖Web服务的默认行为。 我不完全确定这甚至是可能的。

我知道这不是最有用的答案,但可能会让你朝着正确的方向前进。