2012-04-15 83 views
1

我试图通过AJAX在WebForms应用程序中调用Web服务。

我的剧本看起来是这样的:

$.post('UpdateServer.asmx/ProcessItem', 
    'itemId=' + $(this).text(), 
    function (result) { 
     alert(result); 
    }); 

我的web服务看起来是这样的。

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[System.ComponentModel.ToolboxItem(false)] 
[System.Web.Script.Services.ScriptService] 
public class UpdateServer : System.Web.Services.WebService 
{ 
    [WebMethod] 
    public string ProcessItem(int itemId) 
    { 
     return new JavaScriptSerializer().Serialize(
      new { Success = true, Message = "Here I am!" }); 
    } 
} 

Web方法按预期的方式调用,并带有预期的参数。然而,传递给我的成功函数(最后一个参数为$ .post())的参数是文档类型,并且不包含我期望的成功和消息成员。

什么是魔术词,以便我可以找回我期待的对象?

编辑

仔细观察,我能找到我要找的如下数据:

result.childNodes [0] .childNodes [0]。数据: “ { “成功”:真实的, “消息”: “服务器更新成功!”}”

+0

你可以发布该方法的实际http响应吗?你可以使用chrome开发工具或者像fiddler这样的工具记录下来。 – 2012-04-15 21:08:36

+0

什么是你收到的文件? – domoindal 2012-04-15 21:14:23

回答

2

你看到的是,随着JSON端节点奇结构是因为你没有调用服务the necessary way to coax JSON out of ASMX ScriptServices,然后返回反正一个JSON字符串的原因。因此,最终结果是您要返回包含该JSON字符串的单个值的XML文档。

你现在运行的两个具体问题是,你是manually JSON serializing your return value,而你没有调用内容类型为application/json(.NET需要切换到JSON序列化响应)的服务。

一旦你修复了这些问题,你还会遇到一个“无效的JSON基元”错误due to the data parameter being URL encoded instead of a valid JSON string

得到它的工作,做到这一点的服务器端:

[ScriptService] 
public class UpdateServer : System.Web.Services.WebService 
{ 
    [WebMethod] 
    public object ProcessItem(int itemId) 
    { 
    return new { Success = true, Message = "Here I am!" }; 
    } 
} 

您还可以创建一个数据传输对象(又名视图模型)返回,而不是使用匿名类型和object,如果你想。

顺利拿到原始JSON出的是,这样做对客户端:

$.ajax({ 
    url: 'UpdateServer.asmx/ProcessItem', 
    type: 'post', 
    contentType: 'application/json', 
    data: '{"itemId":' + $(this).text() + '}', 
    success: function(result) { 
    // This will be { d: { Success: true, Message: "Here I am!" } }. 
    console.log(result); 
    } 
}); 

如果你有几分钟的时间,通过在jQuery for the ASP.NET developer通信部分职位读取。随着您继续沿着这条道路前进,您会发现很多有用的信息。

注意:helmus左边的链接是相关的。 2之间没有什么根本改变。0并介绍如何使用ASMX ScriptServices通过JSON进行通信。如果您对.NET中的这个问题采取真正尖端的方法感兴趣,那么ASP.NET Web API就是您的选择。

+0

非常感谢@Dave,我已经编程了很多年,但对这些技术来说相当新颖。看起来有时'data'成员应该是'arg = value'格式,其他时间应该是JSON。我没有在这里找到一致性,正如你所看到的,这里的其他答案不能澄清。当然,你的例子是完全正确的,并且效果很好。显然,我需要花更多的时间来更好地理解它。 – 2012-04-16 01:38:09

+0

@JonathanWood:你需要在这里传递JSON字符串的原因是因为application/json的'contentType'设置指定传入数据将采用JSON格式。如果没有该设置,则URL编码的键=值对将是适当的。但是,如果* request *也以JSON形式出现,那么ASP.NET只会响应JSON,因此这不是一种选择。 – 2012-04-16 13:13:47

0

这个属性添加到您的ProcessItem方法:

[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
+0

这似乎没有改变任何东西。 – 2012-04-15 21:11:54

+0

也许你需要明确指定$ .post调用的dataType参数为“json”。 – Tuan 2012-04-15 21:28:27

0

请在您的$.post调用中更加明确。

$.ajax({ 
    type:'post', 
    url:'UpdateServer.asmx/ProcessItem', 
    data: {'itemId':$(this).text()} 
}).done(function (result) { 
     alert(result); 
}); 
+0

你为什么推荐这个?你觉得$ .post()有问题吗? – 2012-04-15 21:26:00

+0

http://icewalker2g.wordpress.com/2011/05/08/avoid-jquery-post-or-jquery-get-if-possible-use-jquery-ajax-instead/ – 2012-04-15 21:28:00

+0

谢谢。也许我们应该避免$ .post()。但是上面的代码对我来说有很多错误。谁会想到这个东西会如此敏感!?! – 2012-04-15 21:54:19