JSONP(JSON with Padding)可以看成是JSON的一种“使用模式”,用以解决“跨域访问”的问题,这篇简单的文章给出一个简单的例子用于模拟如何通过jQuery以JSONP的访问调用一个WCF REST服务。[源代码从这里下载]

在这个例子中,我们将定义一个用于返回所有员工信息的服务,下面是用于表示员工信息的Employee的类型和契约接口。契约接口IEmployees的GetAll操作用以返回所有员工列表,我们指定了Uri模板并将回复消息格式设置为JSON。

   1: using System.Collections.Generic;

   2: using System.ServiceModel;

   3: using System.ServiceModel.Web;

   4: namespace Artech.WcfServices.Service.Interface

   5: {

   6:     [ServiceContract]

   7:     public interface IEmployees

   8:     {

   9:         [WebGet(UriTemplate = "all",ResponseFormat =WebMessageFormat.Json)]      

  10:         IEnumerable<Employee> GetAll();

  11:     }

  12:     public class Employee

  13:     {

  14:         public string Id { get; set; }

  15:         public string Name { get; set; }

  16:         public string Department { get; set; }

  17:         public string Grade { get; set; }

  18:     }

  19: }

在如下所示的服务类型EmployeesService 中,我们直接让服务操作GetAll返回一个包含3个Employee对象的列表。

   1: using System.Collections.Generic;

   2: using Artech.WcfServices.Service.Interface;

   3: namespace Artech.WcfServices.Service

   4: {

   5:     public class EmployeesService : IEmployees

   6:     {

   7:         public IEnumerable<Employee> GetAll()

   8:         {

   9:             return new List<Employee>

  10:             {

  11:                 new Employee{ Id = "001", Name="张三", Department="开发部", Grade = "G6"},    

  12:                 new Employee{ Id = "002", Name="李四", Department="人事部", Grade = "G7"}, 

  13:                 new Employee{ Id = "003", Name="王五", Department="销售部", Grade = "G8"}

  14:             };

  15:         }

  16:     }

  17: }

我们通过控制台程序对服务进行寄宿。从下面的配置可以看到我们采用了标准终结点WebHttpEndpoint。为了让服务具有跨域支持的能力,我们必须将标准终结点的crossDomainScriptAccessEnabled属性设置为True。WebHttpBinding也具有同名的属性,如果直接使用WebHttpBinding也需要将该属性设置为True。

   1: <configuration>

   2:   <system.serviceModel>

   3:     <standardEndpoints>

   4:       <webHttpEndpoint>

   5:         <standardEndpoint crossDomainScriptAccessEnabled="true"/>

   6:       </webHttpEndpoint>

   7:     </standardEndpoints>

   8:     <bindings>

   9:       <webHttpBinding>

  10:         <binding crossDomainScriptAccessEnabled="true" />

  11:       </webHttpBinding>

  12:     </bindings>

  13:     <services>      

  14:       <service name="Artech.WcfServices.Service.EmployeesService">

  15:         <endpoint kind="webHttpEndpoint" 

  16:                   address="http://127.0.0.1:3721/employees"

  17:                   contract="Artech.WcfServices.Service.Interface.IEmployees"/>

  18:       </service>

  19:     </services>

  20:   </system.serviceModel>

  21: </configuration>

在客户端,我们在一个Web页面中通过jQuery进行Ajax调用这个服务,并将得到的员工列表显示在一个表格中。出CSS之外的页面代码如下所示,需要注意的是在进行Ajax调用的使用将dataType选项设置成“jsonp”,而不是“json”。

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

   2: <html xmlns="http://www.w3.org/1999/xhtml">

   3:   <head>

   4:     <title>员工列表</title>

   5:     <style type="text/css">

   6:        ...

   7:     </style>

   8:     <script src="Scripts/jquery-1.7.1.js" type="text/javascript"></script>

   9:     <script type="text/javascript">

  10:         $(function () {

  11:             $.ajax({

  12:                 type: "get",

  13:                 url: "http://127.0.0.1:3721/employees/all",

  14:                 dataType: "jsonp",

  15:                 success: function (employees) {

  16:                     $.each(employees, function (index, value) {

  17:                         var detailUrl = "detail.html?id=" + value.Id;

  18:                         var html = "<tr><td>";

  19:                         html += value.Id + "</td><td>";

  20:                         html += "<a href='" + detailUrl + "'>" + value.Name + "</a></td><td>";

  21:                         html += value.Grade + "</td><td>";

  22:                         html += value.Department + "</td></tr>";

  23:                         $("#employees").append(html);

  24:                     });

  25:                     $("#employees tr:odd").addClass("oddRow");

  26:                 }

  27:             });

  28:         });

  29:      </script>

  30:   </head>

  31:   <body>

  32:     <table id="employees" width="600px">

  33:         <tr>

  34:             <th>ID</th>

  35:             <th>姓名</th>

  36:             <th>级别</th>

  37:             <th>部门</th>

  38:         </tr>

  39:     </table>

  40: </body>

  41: </html>

当服务启动后在浏览器中显示上面这个Web页面,会得到如下所示的员工列表。

一个通过JSONP跨域调用WCF REST服务的例子(以jQuery为例)的更多相关文章

  1. 实现jquery.ajax及原生的XMLHttpRequest跨域调用WCF服务的方法

    关于ajax跨域调用WCF服务的方法很多,经过我反复的代码测试,认为如下方法是最为简便的,当然也不能说别人的方法是错误的,下面就来上代码,WCF服务定义还是延用上次的,如: namespace Wcf ...

  2. jquery跨域调用wcf

    使用jquery跨域调用wcf服务的时候会报如下错误 $.ajax({ url: 'http://localhost:28207/Service1.svc/GetData', method: 'get ...

  3. jsonP跨域调用

    -------------------------------------jsonP跨域调用------------------------------------- <div class=&q ...

  4. jquery中的jsonp跨域调用

                                                    jquery jsonp跨域调用接口

  5. jquery中的jsonp跨域调用(接口)

                                                                           jquery jsonp跨域调用接口

  6. jquery ajax jsonp跨域调用实例代码

    今天研究了AJAX使用JSONP进行跨域调用的方法,发现使用GET方式和POST方式都可以进行跨域调用,这里简单分享下,方便需要的朋友 客户端代码 复制代码 代码如下: <%@ Page Lan ...

  7. 使用jsonp跨域调用百度js实现搜索框智能提示,并实现鼠标和键盘对弹出框里候选词的操作【附源码】

    项目中常常用到搜索,特别是导航类的网站.自己做关键字搜索不太现实,直接调用百度的是最好的选择.使用jquery.ajax的jsonp方法可以异域调用到百度的js并拿到返回值,当然$.getScript ...

  8. 使用jsonp跨域调用百度js实现搜索框智能提示(转)

    http://www.cnblogs.com/oppoic/p/baidu_auto_complete.html 项目中常常用到搜索,特别是导航类的网站.自己做关键字搜索不太现实,直接调用百度的是最好 ...

  9. ASP.NET Web API 自定义MediaType实现jsonp跨域调用

    代码来自<ASP.NET Web API 2 框架揭秘>一书. 直接上代码: /// <summary> /// 自定义jsonp MediaType /// </sum ...

随机推荐

  1. Java提高篇(三五)-----Java集合细节(一):请为集合指定初始容量

    集合是我们在Java编程中使用非常广泛的,它就像大海,海纳百川,像万能容器,盛装万物,而且这个大海,万能容器还可以无限变大(如果条件允许).当这个海.容器的量变得非常大的时候,它的初始容量就会显得很重 ...

  2. [ZigBee] 10、ZigBee之睡眠定时器

    0.概述 睡眠定时器用于设置系统进入和退出低功耗睡眠模式之间的周期.睡眠定时器还用于当进入低功耗睡眠模式时,维持定时器2 的定时. 睡眠定时器的主要功能如下: ● 24 位的定时器正计数器,运行在32 ...

  3. mysqlnd cannot connect to MySQL 4.1+

    phpMyAdmin - error #2000 - mysqlnd cannot connect to MySQL 4.1+ using the old insecure authenticatio ...

  4. Linux grep与正则表达式

    grep命令         格式:grep [-acinv] [--color=auto] '查找字符串' filename -a 将binary文件以text文件的 -c 计算找到 ‘查找字符串’ ...

  5. Eclipse中java向数据库中添加数据,更新数据,删除数据

    前面详细写过如何连接数据库的具体操作,下面介绍向数据库中添加数据. 注意事项:如果参考下面代码,需要 改包名,数据库名,数据库账号,密码,和数据表(数据表里面的信息) package com.ning ...

  6. C++生成二级制文件过程(预处理->编译->链接 )

    转载请注明出处 Windows下C++编程,通过VC生成工程,编写C++源文件,点运行,代码没问题直接出结果.VC什么都帮我们搞了,不了解其中过程也完全没问题. 转到linux下写c++,总觉得有点虚 ...

  7. Android笔记——活动的生命周期

    一.活动的重要性 掌握活动的生命周期对任何 Android 开发者来说都非常重要,当你深入理解活动的生命周期之后,就可以写出更加连贯流畅的程序,并在如何合理管理应用资源方面,你会发挥的游刃有余.你的应 ...

  8. asp.net mvc 使用ajax请求 控制器 (PartialViewResult)分部的action,得到一个分部视图(PartialView)的HTML,进行渲染

    在asp.net mvc 使用ajax请求获取数据的时候,我们一般是返回json或者xml,然后解析这些数据进行渲染,这样会比较麻烦,可以请求一个 分部action,返回一个分部视图 直接可以渲染,不 ...

  9. (2)艺术创新思维的PS成果

        一些艺术创新思维课的PS成果. (1)选择一首喜欢的歌并用图表示出来: (2)用形式美法则设计一张图来表示"痴心妄想"这四个词语,可以采用字体的变形,也可以采用词语的意境. ...

  10. 对于资源上MissingScript的清理方案讨论

    Unity工程随着复杂度的提升,常会有Prefab上的脚本丢失的情况,如下图所示: 首先失去关联的脚本,是没有线索找到原来是什么文件的,那么有没有办法批处理将这些MissingScript进行一下清理 ...