如何从 2.0 asmx Web 服务返回 JSON
Posted
技术标签:
【中文标题】如何从 2.0 asmx Web 服务返回 JSON【英文标题】:How to return JSON from a 2.0 asmx web service 【发布时间】:2010-09-22 06:39:03 【问题描述】:我正在使用 .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 <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' 并得到相同的结果。
这里是web服务方法:
<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 时如何强制 Web 服务返回 Json?
请不要告诉我升级到 .Net Framework 3.5 或类似的东西(我没那么愚蠢)。我需要 2.0 解决方案。
【问题讨论】:
也许你可以使用我的解决方案; ***.com/questions/26140330/… 你可以试试我的解决方案; ***.com/questions/26140330/… 【参考方案1】:return JSON from ASMX services in ASP.NET 2.0 没问题。您只需要安装 ASP.NET AJAX Extensions。
请务必将 [ScriptService] 装饰添加到您的 Web 服务中。这就是指示 ASP.NET AJAX 框架的服务器端部分为格式正确的请求返回 JSON 的原因。
此外,如果您在 2.0 中使用它,您需要在我的示例中从“msg.d”中删除“.d”。 The ".d" is a security feature that came with 3.5.
【讨论】:
遗憾的是,该 encosia 链接现在在我的浏览器中触发了攻击页面警告。【参考方案2】:响应包含在一个元素中,因为您的方法说它将返回一个字符串。您可以使用它来发送纯 json,但您的 wsdl 会被愚弄(该函数是无效的,但会响应数据)。
[WebMethod(Description="return pure JSON")]
public void retrieveByIdToPureJSON( int id )
Context.Response.Write( JsonConvert.SerializeObject( mydbtable.getById(id) );
祝你好运,汤姆
顺便说一句:JsonConvert 参见 Newtonsoft.Json
【讨论】:
就这么简单。从 Function 更改为 Sub(在 Vb.net 中)并删除返回但使用 response.write 输出。 2 周尝试各种事情来摆脱那个讨厌的 当我返回时。拯救了我的一天。 Tnxs 我现在想拥抱你,花了我几个小时才找到你的解决方案:)【参考方案3】:您需要使用以下内容装饰您的网络方法:
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
其余的你都做对了 :) 更多信息请访问Encosia 和 Andrew Roland's Blog
编辑:如下所述,这只是 .NET 3.5(我没有意识到这一点,我的错)。
【讨论】:
仅从 3.5 开始支持 'ResponseFormat' 枚举,OP 询问如何在 FW 2.0 中执行。 @Omu 原始发帖人与提出问题的人一样(或在论坛中发起该主题的人)【参考方案4】:您可能无法在 .NET 2.0 中执行 XML 或二进制序列化之外的任何操作。如果您不使用自动生成的 Web 参考,那么不要打扰 ASMX。只需改用 ASPX 或 ASHX。
【讨论】:
【参考方案5】:您可以使用Jayrock library Quick start for 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!";
【讨论】:
我实际上认为这是一个可能的解决方案,如果我不能用普通的 'ol asp.net 做到这一点。谢谢。【参考方案6】:也可以使用 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("")
【讨论】:
【参考方案7】:我可能不是 100% 正确,但我确信 .net 网络服务是基于 XML/SOAP 的。
您需要覆盖网络服务的默认行为。我不完全确定这是否可能。
我知道这不是最有用的答案,但可能会让你朝着正确的方向前进。
【讨论】:
以上是关于如何从 2.0 asmx Web 服务返回 JSON的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 iOS SDK 从 ASMX Web 服务中获取和解析 JSON?
如何从 asmx Web 服务管理多个 ado.net 数据库连接