我正在尝试创建一个动态网页,它不需要回发并与服务器通信以获取复杂对象。我开始创建一个支持AJAX的WCF服务,然后编写一些jquery来与服务进行通信。我按照本教程http://www.codeproject.com/Articles/132809/Calling-WCF-Services-using-jQuery开始工作。
然后我意识到我可以使用MVC单独执行此操作,将JsonResult类型作为控制器上的Action,遵循本教程:http://geekswithblogs.net/michelotti/archive/2008/06/28/mvc-json---jsonresult-and-jquery.aspx。
当我试图按原样离开.cshtml页面时,只需插入不同的服务(从WCF切换到MVC),我的javascript开始崩溃(当它试图评估JS中的response.length时)。我使用WebDevHelper工具检查JSON文件的响应内容并找到关键区别。
MVC JsonResponse给了我这个结果:["anthony"]
支持AJAX的WCF服务给了我:{"GetUserResult":["anthony"]}
WCF方法如下所示:
[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
string[] GetUser(string Id)
{ return new string[] { "foo", "bar" }; }
MVC方法如下所示:
public JsonResult GetUser(string Id)
{ return Json(new string[] { "foo", "bar" }); }
GetUser返回一个字符串数组(在这种情况下,它总是返回数组中的单个项目。)WCF服务上的方法名称称为“GetUser”,但我不完全理解我在看什么,我不知道为什么WCF会提供与MVC不同的数据,最后,为什么javascript可以很好地评估result.length,但崩溃是因为在使用较小的MVC数据时它找不到长度属性?似乎JSON不包括JsonResult中的数组信息?
谢谢!
答案 0 :(得分:1)
我发现了这个问题;启用WCF AJAX的服务将方法名称作为返回值所在的对象返回。我尝试将属性WebMessageBodyStyle.Wrapped更改为WebMessageBodyStyle.Bare来修复此问题 - 但由于某些奇怪的原因,它使我的服务无法解决?我认为这是一个配置问题 - 但无论如何要让它工作,我将它改为WrappedRequest - 这会给我一个Bare响应,并且服务按预期工作。不知道为什么服务会因为这样的小改变而消失,但是......非常古怪