WCF 很好的支持了 REST 的开发, 而 RESTful 的服务通常是架构层面上的考虑。 因为它天生就具有很好的跨平台跨语言的集成能力,几乎所有的语言和网络平台都支持 HTTP 请求,无需去实现复杂的客户端代理,无需使用复杂的数据通讯方式既可以将我们的服务暴露给任何需要的人,无论他使用 VB、Ruby、JavaScript,甚至是 HTML FORM,或者直接在浏览器地址栏输入。 
WCF 中通过 WebGetAttribute、WebInvokeAttribute (GET/PUT/POST/DELETE)、UriTemplate 定义 REST 的服务的调用方式, 通过WebMessageFormat (Xml/Json) 定义消息传递的格式。

1. 契约

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Runtime.Serialization;
  4. using System.ServiceModel;
  5. using System.ServiceModel.Web;
  6. namespace WcfRESTfulSvc1
  7. {
  8. [ServiceContract]
  9. public interface ITaskService
  10. {
  11. [OperationContract]
  12. [WebGet(UriTemplate="Tasks/Xml", ResponseFormat=WebMessageFormat.Xml)]
  13. List<Task> GetTasksXml();
  14. [OperationContract]
  15. [WebGet(UriTemplate = "Tasks/Json", ResponseFormat = WebMessageFormat.Json)]
  16. List<Task> GetTasksJson();
  17. [OperationContract]
  18. [WebInvoke(UriTemplate="Task/{title}", Method="GET", ResponseFormat=WebMessageFormat.Json)]
  19. Task GetTasksByTitle(string title);
  20. }
  21. [DataContract]
  22. public class Task
  23. {
  24. [DataMember]
  25. public string Title { get; set; }
  26. [DataMember]
  27. public string Detail { get; set; }
  28. [DataMember]
  29. public DateTime CreatedDate { get; set; }
  30. }
  31. }

2. 实现

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. namespace WcfRESTfulSvc1
  5. {
  6. public class TaskService : ITaskService
  7. {
  8. public List<Task> GetTasksXml()
  9. {
  10. return GetData();
  11. }
  12. public List<Task> GetTasksJson()
  13. {
  14. return GetData();
  15. }
  16. public Task GetTasksByTitle(string title)
  17. {
  18. return GetData().Where(t => t.Title == title).FirstOrDefault();
  19. }
  20. private static List<Task> GetData()
  21. {
  22. return new List<Task>
  23. {
  24. new Task { Title="Task1", Detail="Do Something 1", CreatedDate=DateTime.Now },
  25. new Task { Title="Task2", Detail="Do Something 2", CreatedDate=DateTime.Now },
  26. new Task { Title="Task3", Detail="Do Something 3", CreatedDate=DateTime.Now },
  27. new Task { Title="Task4", Detail="Do Something 4", CreatedDate=DateTime.Now },
  28. new Task { Title="Task5", Detail="Do Something 5", CreatedDate=DateTime.Now },
  29. };
  30. }
  31. }
  32. }

通过 WCF 4.0 里创建的 WCF Service Application 发布REST服务很简单,只需要在 svc 的 Markup 里加上 Factory:
<%@ ServiceHost Language="C#" Debug="true" Service="WcfRESTfulSvc1.TaskService" CodeBehind="TaskService.svc.cs"Factory="System.ServiceModel.Activation.WebServiceHostFactory"%>
BTW: 不过这样,WCF的Metadata就不能访问到了,也就说不能访问到svc的wsdl了。

OK,在浏览器中键入 http://localhost:2571/TaskService.svc/Tasks/Xml  就能得到结果:

  1. <ArrayOfTask xmlns="http://schemas.datacontract.org/2004/07/WcfRESTfulSvc1" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  2. <Task>
  3. <CreatedDate>2011-03-09T21:51:13.3376004+08:00</CreatedDate>
  4. <Detail>Do Something 1</Detail>
  5. <Title>Task1</Title>
  6. </Task>
  7. <Task>
  8. <CreatedDate>2011-03-09T21:51:13.3376004+08:00</CreatedDate>
  9. <Detail>Do Something 2</Detail>
  10. <Title>Task2</Title>
  11. </Task>
  12. <Task>
  13. <CreatedDate>2011-03-09T21:51:13.3376004+08:00</CreatedDate>
  14. <Detail>Do Something 3</Detail>
  15. <Title>Task3</Title>
  16. </Task>
  17. <Task>
  18. <CreatedDate>2011-03-09T21:51:13.3376004+08:00</CreatedDate>
  19. <Detail>Do Something 4</Detail>
  20. <Title>Task4</Title>
  21. </Task>
  22. <Task>
  23. <CreatedDate>2011-03-09T21:51:13.3376004+08:00</CreatedDate>
  24. <Detail>Do Something 5</Detail>
  25. <Title>Task5</Title>
  26. </Task>
  27. </ArrayOfTask>

客户端的调用利用System.Net.WebClient也很容易:

  1. var client = new WebClient();
  2. this.txtResponse.Text = client.DownloadString(url);

Json的返回结果:
[{"CreatedDate":"//Date(1299687080328+0800)//","Detail":"Do Something 1","Title":"Task1"},{"CreatedDate":"//Date(1299687080328+0800)//","Detail":"Do Something 2","Title":"Task2"},{"CreatedDate":"//Date(1299687080328+0800)//","Detail":"Do Something 3","Title":"Task3"},{"CreatedDate":"//Date(1299687080328+0800)//","Detail":"Do Something 4","Title":"Task4"},{"CreatedDate":"//Date(1299687080328+0800)//","Detail":"Do Something 5","Title":"Task5"}]

再来看看利用jQuery如何调用这个服务:

  1. <mce:script type="text/javascript" language="JavaScript"><!--
  2. $(document).ready(function () {
  3. $("#btnGet").click(function () {
  4. var url = $("#txtUrl").val();
  5. $.get(url, function (data) {
  6. for (var i = 0; i < data.length; i++)
  7. $("#divResponse").append("<li>" +
  8. data[i].Title + "&nbsp;-&nbsp;" +
  9. data[i].Detail + "</li>");
  10. });
  11. });
  12. });
  13. // --></mce:script>

【REST WCF系列】
RESTful WCF Services (1) (入门)
RESTful WCF Services (2) (实现增,删,改,查)
RESTful WCF Services (3) (Raw Stream)
RESTful WCF Services (4) (Basic Security)
RESTful WCF Services (实例) (并发同步服务 SyncService)

http://blog.csdn.net/fangxing80/article/details/6235662

WCF4.0 –- RESTful WCF Services (1) (入门)的更多相关文章

  1. WCF4.0 –- RESTful WCF Services

    转自:http://blog.csdn.net/fangxinggood/article/details/6235662 WCF 很好的支持了 REST 的开发, 而 RESTful 的服务通常是架构 ...

  2. CRUD using Spring MVC 4.0 RESTful Web Services and AngularJS

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  3. IIS8.0 部署WCF Services

    今天在Win 8的IIS上部署WCF Services,访问SVC文件时出现找不到处理程序的错误,以前遇到这个问题时都是尝试通过注册asp.net的方式处理一下,但是在Win8下这招不灵了,出现如下提 ...

  4. WCF学习之旅—WCF4.0中的简化配置功能(十五)

    六 WCF4.0中的简化配置功能 WCF4.0为了简化服务配置,提供了默认的终结点.绑定和服务行为.也就是说,在开发WCF服务程序的时候,即使我们不提供显示的 服务终结点,WCF框架也能为我们的服务提 ...

  5. .NET RESTful Web Services入门

    很早之前看到过RESTful Web Services,并未在意,也没找相关资料进行学习.今天偶尔有一机会,就找了点资料进行研究,发现RESTful真是“简约而不简单”.下面用示例来说明: 1 项目结 ...

  6. 如何创建一个RESTful WCF Service

    原创地址:http://www.cnblogs.com/jfzhu/p/4044813.html 转载请注明出处 (一)web.config文件 要创建REST WCF Service,endpoin ...

  7. WCF4.0安装 NET.TCP启用及常见问题

    WCF4.0安装及NET.TCP启用 WCF 4.0 一般默认安装.net Framework 4.0的时候已经安装. 但如果先装.net framework 4.0,后装IIS,就会出现问题.需要重 ...

  8. Jersey the RESTful Web Services in Java

    Jersey 是一个JAX-RS的实现, JAX-RS即Java API for RESTful Web Services, 支持按照表述性状态转移(REST)架构风格创建Web服务. REST 中最 ...

  9. 使用 Spring 3 来创建 RESTful Web Services

    来源于:https://www.ibm.com/developerworks/cn/web/wa-spring3webserv/ 在 Java™ 中,您可以使用以下几种方法来创建 RESTful We ...

随机推荐

  1. 安卓第四天笔记-Sqlite

    安卓第四天笔记-Sqlite 1.数据库的创建运行与更新 1.1.创建一个类继承SqliteOpenHelper 1.2.创建构造方法 /** * 数据库创建类 * @author 刘楠 * * 20 ...

  2. javascript 全局变量 局部变量 var 与不加var的区别

      一.外部的为全局,内部的为局部变量.   二.加var为局部变量(在方法内),不加var为全局变量(当方法内有一次使用后) <script type="text/javascrip ...

  3. canvas & animation

    1.using canvas using canvas to set difference property. it will showing like an animation. The true ...

  4. C# 文件操作(上传,下载,读取,写入)

    1. 通过byte[]数据下载文件(这种方法可用于以开放Api的形式传递文件内容) public void FileDownLoadByByte(byte[] fileData, string fil ...

  5. Python基本语法初试

    编程环境: win7旗舰版 Python 3.2.2(default, Sep  4 2011,09:51:08) 代码来源:(Python菜鸟) 代码内容: Python基本的输出语句print(& ...

  6. ArcGis 10+Oracle发布WFS-T服务,无法更新Feature的解决方法

    现象: 前端采用Openlayers,更新Feature时服务器端返回的XML提示更新错误 原因: 参考:http://support.esri.com/en/knowledgebase/techar ...

  7. spark加载hadoop本地库的时候出现不能加载的情况要怎么解决呢?

    hadoop shell运行的时候不会报这个错误,因为我已经重新在64位机上编译了源文件,并把so文件复制到hadoop的native目录下,而且环境变量也设置正确了,所以hadoop本身没有问题. ...

  8. listview中OnItemClick方法各个参数的作用

    OnItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) 1.arg0,arg2 m_listview.setOnI ...

  9. MIT jos 6.828 Fall 2014 训练记录(lab 6)

    源代码参见我的github: https://github.com/YaoZengzeng/jos 在这个实验中将实现一个基于Intel 82540M(又称E1000)的网卡驱动.不过,一个网卡驱动还 ...

  10. 如何利用python模仿浏览器进行网页爬取?

    http://wwwsearch.sourceforge.net/mechanize/ http://www.ibm.com/developerworks/cn/linux/l-python-mech ...