找回密码
 FreeOZ用户注册
查看: 3093|回复: 22
打印 上一主题 下一主题

[论坛技术] Ajax与Wcf交互-JSON

[复制链接]
跳转到指定楼层
1#
发表于 6-7-2008 15:08:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
提示: 作者被禁止或删除, 无法发言

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?FreeOZ用户注册

x
Ajax与WCF之间的JSON操作远远不止这么简单,特别是它这种也适合extjs和jquery的编程模型。这篇文章是入门文章,算是引路吧,一个很好的演练教材。可以大致了解WCF的工作方式。前端代码传递数值到JavaScript,再有JavaScript脚本调用WCF服务,WCF服务需要使用ScriptManager控件预先被引用到页面中。调用WCF与服务器交互,然后返回数据,传递到JavaScript脚本,动态改变页面。通过直接与JavaScript脚本交互,前端技术可以使用任何流行框架,例如ExtJS或者JQuery等,参数和数据是以JSON格式传递的。

这种开发方式应该会越来越流行,进而成为AJAX开发的主流方式,看看吧。
有问题的话去原文留言,或者在这里问我。


原文链接
http://www.cnblogs.com/jillzhang/archive/2008/06/14/1221081.html

源代码下载
http://www.cnblogs.com/Files/jillzhang/AjaxWcfJson.rar

原文有建立项目的关键步骤介绍,看代码的同学请注意,下面代码里面的是四组两个连着的单引号,(我开始看成了四个双引号,所以调试失败,后来认真看博主的代码才知道原来是这里的错误)
  1. Name:''+name+'',
  2. Address:''+address+''
复制代码
一共只需要在两个文件里增加代码
  1. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="AjaxWcfJson._Default" %>

  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

  3. <html xmlns="http://www.w3.org/1999/xhtml" >
  4. <head runat="server">
  5. <script type="text/javascript">
  6.     function createPerson() {
  7.         var name = $get("txtName").value;
  8.         var address = $get("txtAddress").value;
  9.         var p = {
  10.             Name:''+name+'',
  11.             Address:''+address+''
  12.         }
  13.         WcfJsonService.CreatePerson(p, onSuccess);
  14.     }

  15.     function onSuccess(res) {
  16.         alert(res);
  17.     }

  18.     function getPerson() {
  19.         var name = $get("txtName2").value;
  20.         WcfJsonService.GetPerson(name, onSuccess2);
  21.     }

  22.     function onSuccess2(res) {
  23.         alert("Name:"+res.Name+",Address:"+res.Address);
  24.     }
  25. </script>
  26.     <title></title>
  27. </head>
  28. <body>
  29.     <form id="form1" runat="server">
  30.     <div>
  31.         <asp:ScriptManager ID="ScriptManager1" runat="server">
  32.             <Scripts>
  33.                 <asp:ScriptReference Path="~/WcfJsonService.svc/js" />
  34.             </Scripts>
  35.         </asp:ScriptManager>
  36.         <h2>Ajax wcf json</h2>
  37.         Name: <input id="txtName" type="text" />

  38.         Address: <input id="txtAddress" type="text" />

  39.         <input id="button1" type="button" value="Submit" onclick="createPerson()" />

  40.         

  41.         
  42.         Name: <input id="txtName2" type="text" />

  43.         <input id="button2" type="button" value="Submit2" onclick="getPerson()" />
  44.         
  45.    
  46.     </div>
  47.     </form>
  48. </body>
  49. </html>
复制代码
  1. using System.Runtime.Serialization;
  2. using System.ServiceModel;
  3. using System.ServiceModel.Activation;
  4. using System.ServiceModel.Web;
  5. using System.Collections.Generic;
  6. using System.Diagnostics;

  7. namespace AjaxWcfJson
  8. {
  9.     [DataContract]
  10.     public class Person
  11.     {
  12.         [DataMember]
  13.         public string Name { get; set; }
  14.         [DataMember]
  15.         public string Address { get; set; }
  16.     }
  17.    
  18.     [ServiceContract(Namespace = "")]
  19.     [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
  20.     public class WcfJsonService
  21.     {
  22.         static List<Person> list = new List<Person>();

  23.         // Add [WebGet] attribute to use HTTP GET
  24.         [OperationContract]
  25.         [WebInvoke(RequestFormat = WebMessageFormat.Json)]
  26.         public bool CreatePerson(Person p)
  27.         {
  28.             // Add your operation implementation here
  29.             foreach (Person person in list)
  30.             {
  31.                 if (p.Name == person.Name)
  32.                 {
  33.                     return false;
  34.                 }
  35.             }
  36.             list.Add(p);
  37.             Trace.WriteLine("--------------------------------------------");
  38.             foreach (Person person in list)
  39.             {
  40.                 Trace.WriteLine("Name:" + person.Name + ",Address:" + person.Address);
  41.             }
  42.             Trace.WriteLine("---------------------------------------------");
  43.             return true;
  44.         }

  45.         [OperationContract]
  46.         [WebInvoke(RequestFormat = WebMessageFormat.Json)]
  47.         public Person GetPerson(string name)
  48.         {
  49.             foreach (Person p in list)
  50.             {
  51.                 if (p.Name == name)
  52.                 {
  53.                     return p;
  54.                 }
  55.             }
  56.             return new Person();
  57.         }
  58.         // Add more operations here and mark them with [OperationContract]
  59.     }
  60. }
复制代码
回复  

使用道具 举报

2#
 楼主| 发表于 6-7-2008 15:15:57 | 只看该作者
提示: 作者被禁止或删除, 无法发言
你可以用博主推荐的那个using System.Diagnostics的Trace功能调试,当然也可以直接用 FireFox+FireBug 查看到底调用了什么WCF服务,如图。
回复  

使用道具 举报

3#
 楼主| 发表于 6-7-2008 15:22:42 | 只看该作者
提示: 作者被禁止或删除, 无法发言
通过FireBug可以看到,JSON自动对输入的字符串进行编码,即使输入了引号,单引号,之类的其他控制字符分隔符也是没问题的。所以这一步不需要程序员自己担心。

输入
erw''''e""r'',''t'w'e"r"w,e

JSON编码
{"p":{"Name":"780","Address":"erw''''e\"\"r'',''t'w'e\"r\"w,e"}}
回复  

使用道具 举报

4#
 楼主| 发表于 6-7-2008 15:33:54 | 只看该作者
提示: 作者被禁止或删除, 无法发言
原来不知道可以通过这样写来读取表单值得,看起来这种写法比较简单

  1. var name = $get("txtName").value;
  2. var address = $get("txtAddress").value;
复制代码
原来我一直用DOM一步一步找下去的。。。。
回复  

使用道具 举报

5#
 楼主| 发表于 6-7-2008 15:36:45 | 只看该作者
提示: 作者被禁止或删除, 无法发言
再注意那个组装JSON对象的方法比较特殊,需要记住。
  1.         var p = {
  2.             Name:''+name+'',
  3.             Address:''+address+''
  4.         }
复制代码
回复  

使用道具 举报

6#
 楼主| 发表于 6-7-2008 15:38:54 | 只看该作者

这一段就是用控件来引用WCF服务的

提示: 作者被禁止或删除, 无法发言
注意,这个文件的位置是项目根目录下的~/WcfJsonService.svc,可是作者在后边加了一个 /js 我不知道是为什么,需要注意一下。
  1. <asp:ScriptManager ID="ScriptManager1" runat="server">
  2.             <Scripts>
  3.                 <asp:ScriptReference Path="~/WcfJsonService.svc/js" />
  4.             </Scripts>
  5.         </asp:ScriptManager>
复制代码
回复  

使用道具 举报

7#
 楼主| 发表于 6-7-2008 15:47:06 | 只看该作者

JavaScript调用WCF的方式

提示: 作者被禁止或删除, 无法发言
WcfJsonService.CreatePerson(p, onSuccess)
服务名.功能函数名(参数, 回调函数)
那个参数如果是一个值得话,就可以随便写了,如果是两个或者两个以上的参数,或者是一组数据,就需要预先组装成JSON对象了。
调用成功的话,服务器传递回来的值传递给回调函数,同样传递回来的数据也是一个值,或者一个JSON对象。
  1. .....................      
  2. WcfJsonService.CreatePerson(p, onSuccess);
  3.     }

  4.     function onSuccess(res) {
  5.         alert(res);
  6.     }
复制代码
回复  

使用道具 举报

8#
 楼主| 发表于 6-7-2008 15:52:05 | 只看该作者
提示: 作者被禁止或删除, 无法发言
JSON数据格式是通过这里定义的
[DataContract]

通过里声明
[OperationContract]
[WebInvoke(RequestFormat = WebMessageFormat.Json)]

通过这里限定了服务类型
[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
回复  

使用道具 举报

9#
 楼主| 发表于 6-7-2008 15:53:52 | 只看该作者
提示: 作者被禁止或删除, 无法发言
  固定写法比较多,看来还是挺麻烦的,倒来倒去的,还需要在看进一步的例子,才能够学明白。我接着找。
回复  

使用道具 举报

10#
发表于 6-7-2008 16:17:53 | 只看该作者
虫虫写了这么多,我一句也看不懂,这个东东的好处在哪里呢?

[ 本帖最后由 空明七心 于 6-7-2008 16:24 编辑 ]
回复  

使用道具 举报

11#
 楼主| 发表于 6-7-2008 17:10:28 | 只看该作者

回复 #10 空明七心 的帖子

提示: 作者被禁止或删除, 无法发言
现在使用成型的AJAX框架开发web2.0网站应用很流行,怎么样结合这些流行框架和后台服务器技术呢?WCF就是微软提供的一种服务接口。
这样,你就可以服务器使用微软.net技术,前端随便选用你所喜欢的AJAX框架进行开发。
回复  

使用道具 举报

12#
发表于 6-7-2008 17:58:05 | 只看该作者
原帖由 xblues 于 6-7-2008 17:10 发表
现在使用成型的AJAX框架开发web2.0网站应用很流行,怎么样结合这些流行框架和后台服务器技术呢?WCF就是微软提供的一种服务接口。
这样,你就可以服务器使用微软.net技术,前端随便选用你所喜欢的AJAX框架进行开发。 ...



噢,是这样啊,谢谢虫虫 ,个人认为什么web2.0和web3.0叫好像孔乙已的茴香豆,七种写法八种写法都一个意思,呵呵,期待着生物计算机时代的来到,哈哈,生物科技和IT的完美结合!

可能影响了虫虫的学习贴,虫虫莫怪啊!

[ 本帖最后由 空明七心 于 6-7-2008 18:01 编辑 ]
回复  

使用道具 举报

13#
发表于 6-7-2008 17:59:19 | 只看该作者
LZ厉害,不过这个发在这里,可能太专业了
回复  

使用道具 举报

14#
 楼主| 发表于 6-7-2008 18:26:35 | 只看该作者

回复 #13 flyspirit 的帖子

提示: 作者被禁止或删除, 无法发言
一直都说136ACS的比较多,可是我看也是不好成气候。谁是研究.net的呀?报个名,我们一起研究。
回复  

使用道具 举报

15#
发表于 6-7-2008 19:59:58 | 只看该作者
不太明白这种编程模型跟微软的ASP.NET Ajax 其他编程模型有何区别?比如简单使用WebMethod/PageMethod ,也可以由前端的javascript 发起请求,后端WebService 返回 数据,也可以返回JSON 数据吧?
理解有点乱,不太懂。
回复  

使用道具 举报

16#
 楼主| 发表于 6-7-2008 20:04:12 | 只看该作者
提示: 作者被禁止或删除, 无法发言
你说的是ASP.NET 自己的Atlas框架,当然可以了,但是和目前已经广发被使用的流行JavaScript框架来比,微软的Altlas框架还很不成熟,有待遇发展。你看看那现在的extjs和jquery可以做的事情,就知道atlas还需要怎么发展了。
回复  

使用道具 举报

17#
发表于 7-7-2008 11:23:26 | 只看该作者
LS,能说说EXTJS和JQUERY有哪些目前ASP.NET AJAX还做不到的功能吗?
回复  

使用道具 举报

18#
 楼主| 发表于 7-7-2008 12:03:20 | 只看该作者
提示: 作者被禁止或删除, 无法发言
你可以看看这个ExtJS的DEMO页面,看看他展示的界面。
http://extjs.com/deploy/dev/examples/samples.html

目前的ASP.NET AJAX还在不断的完善中,我个人认为还没有长成,不过微软最近已经发布了新的AJAX roadmap,希望新版马上出来,马上强大。既然是微软的技术,当然前端使用微软的技术才是最方便的。现阶段,如果也想要前端功能强,设计美观一些,就使用这些第三方框架吧。

使用第三方框架的另外一个好处是,后台技术比仅仅局限于微软,这些框架可以和任何流行后台技术结合。PHP,JAVA等等。
回复  

使用道具 举报

19#
 楼主| 发表于 7-7-2008 12:05:18 | 只看该作者

回复 #17 flyspirit 的帖子

提示: 作者被禁止或删除, 无法发言
顺便拜访了一下你的博客,发现你也是搞技术的,欢迎以后常来交流,分享知识。大家互相帮助,一起提高。
回复  

使用道具 举报

20#
发表于 7-7-2008 13:15:05 | 只看该作者
原帖由 xblues 于 7-7-2008 12:03 发表
你可以看看这个ExtJS的DEMO页面,看看他展示的界面。
http://extjs.com/deploy/dev/examples/samples.html

目前的ASP.NET AJAX还在不断的完善中,我个人认为还没有长成,不过微软最近已经发布了新的AJAX roadmap ...


Extjs我接触过一下,很炫很漂亮,你是不是在视觉效果上, ASP.NET的AJAX还有很多路要走?
回复  

使用道具 举报

21#
发表于 7-7-2008 13:16:27 | 只看该作者
原帖由 xblues 于 7-7-2008 12:05 发表
顺便拜访了一下你的博客,发现你也是搞技术的,欢迎以后常来交流,分享知识。大家互相帮助,一起提高。


good, 以后多交流交流。
回复  

使用道具 举报

22#
 楼主| 发表于 7-7-2008 13:45:09 | 只看该作者

回复 #20 flyspirit 的帖子

提示: 作者被禁止或删除, 无法发言
不仅是视觉效果吧,那些动态交互都是传统界面所无法达到的。你看看那个grid的相关操作吧,太强大了。.net的原装控件远远达不到那个功能。类似的功能则只有通过商业插件才能实现,要换很多钱的,还要破解,还不开源。
回复  

使用道具 举报

23#
发表于 7-7-2008 17:53:09 | 只看该作者
这也是AJAX的功劳。
回复  

使用道具 举报

您需要登录后才可以回帖 登录 | FreeOZ用户注册

本版积分规则

小黑屋|手机版|Archiver|FreeOZ论坛

GMT+10, 1-5-2024 22:09 , Processed in 0.057904 second(s), 40 queries , Gzip On, Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表