在上一篇(WCF学习之旅—实现REST服务(二十二))文章中简单介绍了一下RestFul与WCF支持RestFul所提供的方法,本文讲解一下如何创建一个支持REST的WCF服务端程序。

四、在WCF中创建REST服务

1. 在SCF.Contracts 在创建一个服务契约IBookRestService.

这里提供两个方法,分别采用GET和POST方式访问。

我们可以看到,与普通WCF服务契约不同的是,需要额外用WebGet或者WebInvoke指定REST访问的方式。另外还要指定消息包装样式和消息格式,默认的消息请求和响应格式为XML,若选择JSON需要显式声明。

UriTemplate用来将方法映射到具体的Uri上,但如果不指定映射,将映射到默认的Uri。比如采用Get访问的GetBook方法,默认映射是:/ GetBook?BookId={BookId}。

在编写代码的过程中,会出现如下图中1的错误,请引用下图2处的

  1. using SCF.Model;
  2.  
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.ServiceModel;
  7. using System.ServiceModel.Web;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10.  
  11. namespace SCF.Contracts
  12. {
  13.  
  14. [DataContractFormat]
  15. [ServiceContract]
  16. public interface IBookRestService
  17. {
  18.  
  19. //[WebGet(UriTemplate = "/Books/Get/{BookId}/{categroy}", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
  20. [WebGet(UriTemplate = "/Books/Get/{BookId}", BodyStyle = WebMessageBodyStyle.Bare)]
  21. [OperationContract]
  22. List<Books> GetBook(string BookId);
  23.  
  24. //[WebInvoke(Method = "POST", UriTemplate = "/Books/Create", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
  25. [WebInvoke(Method = "POST", UriTemplate = "/Books/Add", BodyStyle = WebMessageBodyStyle.Bare)]
  26. [OperationContract]
  27. Result AddBook(Books book);
  28.  
  29. }
  30.  
  31. }

2. 在项目SCF.Model中创建一个实体对象Books与一个返回对象Result,用作数据传输的载体,下面是Books.cs的内容

  1. namespace SCF.Model
  2. {
  3. using System;
  4. using System.Collections.Generic;
  5. using System.ComponentModel.DataAnnotations;
  6. using System.ComponentModel.DataAnnotations.Schema;
  7. using System.Data.Entity.Spatial;
  8. using System.Runtime.Serialization;
  9. ///DataContract 数据契约:服务端和客户端之间要传送的自定义数据类型
  10. [DataContract(Namespace = "http://tempuri.org/")]
  11. public partial class Books
  12.  
  13. {
  14.  
  15. /// <summary>
  16. /// 在数据传送过程中,只有成员变量可以被传送而成员方法不可以。
  17. /// 并且只有当成员变量加上DataMember时才可以被序列进行数据传输,
  18. /// 如果不加DataMember,客户端将无法获得该属性的任何信息
  19. /// </summary>
  20.  
  21. [DataMember]
  22. [Key]
  23. public int BookID { get; set; }
  24.  
  25. [DataMember]
  26. [Required]
  27. public string Category { get; set; }
  28.  
  29. [DataMember]
  30. [Required]
  31. public string Name { get; set; }
  32.  
  33. [DataMember]
  34. public int Numberofcopies { get; set; }
  35.  
  36. [DataMember]
  37. public int AuthorID { get; set; }
  38.  
  39. [DataMember]
  40. public decimal Price { get; set; }
  41. [DataMember]
  42. public DateTime PublishDate { get; set; }
  43.  
  44. [StringLength()]
  45. [DataMember]
  46. public string Rating { get; set; }
  47. }
  48.  
  49. }
  50.  
  51. using System;
  52. using System.Collections.Generic;
  53. using System.Linq;
  54. using System.Runtime.Serialization;
  55. using System.Text;
  56. using System.Threading.Tasks;
  57.  
  58. namespace SCF.Model
  59. {
  60.  
  61. [DataContract(Namespace = "http://tempuri.org/")]
  62. public class Result
  63. {
  64.  
  65. [DataMember]
  66. public string Message
  67. { get; set; }
  68. }
  69.  
  70. }

     3. SCF.WcfService项目中实现在SCF.Contracts项目中定义的服务契约。这里最简单的实现GetBook和AddBook两个方法的逻辑。

  1. using SCF.Contracts;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Runtime.Serialization;
  6. using System.ServiceModel;
  7. using System.Text;
  8. using SCF.Model;
  9. using SCF.Common;
  10.  
  11. namespace SCF.WcfService
  12. {
  13.  
  14. // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“BookRestService”。
  15. // 注意: 为了启动 WCF 测试客户端以测试此服务,请在解决方案资源管理器中选择 BookRestService.svc 或 BookRestService.svc.cs,然后开始调试。
  16. public class BookRestService : IBookRestService
  17. {
  18.  
  19. Entities db = new Entities();
  20. public Result AddBook(Books book)
  21. {
  22.  
  23. Result result = new Result();
  24. try
  25. {
  26.  
  27. db.Books.Add(book);
  28. db.SaveChanges();
  29. result.Message = string.Format("书名:{0} 已经添加!",book.Name);
  30.  
  31. }
  32. catch (Exception ex)
  33. {
  34. result.Message =ex.Message;
  35. }
  36.  
  37. return result;
  38. }
  39.  
  40. public List<Books> GetBook(string BookId)
  41. {
  42.  
  43. var cateLst = new List<string>();
  44.  
  45. var cateQry = from d in db.Books
  46. orderby d.Category
  47. select d.Category;
  48. cateLst.AddRange(cateQry.Distinct());
  49.  
  50. var books = from m in db.Books
  51. select m;
  52.  
  53. if (!String.IsNullOrEmpty(BookId))
  54. {
  55. books = books.Where(s => s.Name.Contains(BookId));
  56. }
  57.  
  58. List<Books> list = null;
  59. list = books.ToList<Books>();
  60. return list;
  61.  
  62. }
  63.  
  64. }
  65. }

4. 在配置文件在中配置我们的Rest服务,必须使用WebHttpBehavior对服务的终结点进行配置。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <configuration>
  3. <configSections>
  4. <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
  5. <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework,
    Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  6. </configSections>
  7. <entityFramework>
  8. <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
  9. <providers>
  10. <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
  11. </providers>
  12.  
  13. </entityFramework>
  14.  
  15. <system.serviceModel>
  16.  
  17. <bindings>
  18. <webHttpBinding>
  19. <binding name="RestWebBinding">
  20. </binding>
  21. </webHttpBinding>
  22. </bindings>
  23.  
  24. <behaviors>
  25. <serviceBehaviors>
  26. <behavior name="metadataBehavior">
  27.  
  28. <serviceMetadata httpGetEnabled="true" httpGetUrl="http://127.0.0.1:8888/BookService/metadata" />
  29. <serviceDebug includeExceptionDetailInFaults="True" />
  30. </behavior>
  31.  
  32. <behavior name="RestServiceBehavior">
  33. </behavior>
  34. </serviceBehaviors>
  35. <endpointBehaviors>
  36. <behavior name="RestWebBehavior">
  37. <!--这里必须设置-->
  38. <webHttp />
  39. </behavior>
  40. </endpointBehaviors>
  41.  
  42. </behaviors>
  43.  
  44. <services>
  45. <service behaviorConfiguration="metadataBehavior" name="SCF.WcfService.BookService">
  46. <endpoint address="http://127.0.0.1:8888/BookService" binding="wsHttpBinding"
  47. contract="SCF.Contracts.IBookService" />
  48. </service>
  49.  
  50. <service name="SCF.WcfService.BookRestService" behaviorConfiguration="RestServiceBehavior">
  51. <endpoint address="http://127.0.0.1:8888/" behaviorConfiguration="RestWebBehavior"
  52. binding="webHttpBinding" bindingConfiguration="RestWebBinding" contract="SCF.Contracts.IBookRestService">
  53. </endpoint>
  54. </service>
  55.  
  56. </services>
  57. </system.serviceModel>
  58.  
  59. <startup>
  60. <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
  61. </startup>
  62. <connectionStrings>
  63.  
  64. <add name="Entities" connectionString="metadata=res://*/BookModel.csdl|res://*/BookModel.ssdl|res://*/BookModel.msl;
    provider=System.Data.SqlClient;provider connection string=&quot;data source=.\SQLEXPRESS;initial catalog=Test;
    integrated security=SSPI;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  65. </connectionStrings>
  66.  
  67. </configuration>

WCF学习之旅—实现支持REST服务端应用(二十三)的更多相关文章

  1. WCF学习之旅—实现支持REST客户端应用(二十四)

    WCF学习之旅—实现REST服务(二十二) WCF学习之旅—实现支持REST服务端应用(二十三) 在上二篇文章中简单介绍了一下RestFul与WCF支持RestFul所提供的方法,及创建一个支持RES ...

  2. WCF学习之旅—第三个示例之三(二十九)

    上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) 在上一篇文章中我们创建了实体对象与接口协定,在这一篇文章中我们来学习如何创建WCF的服务端代码.具体步骤见下面. ...

  3. WCF学习之旅—第三个示例之一(二十七)

    一.前言 通过前面二十几个章节的学习,我们知道了什么是WCF:WCF中的A.B.C:WCF的传输模式:WCF的寄宿方式:WCF的异常处理.本文综合应用以上知识点,一步一步写一个小的WCF应用程序——书 ...

  4. 一、WCF学习之旅-创建第一个服务

    WCF基本介绍:http://baike.baidu.com/link?url=TGjLYt3HS4dt4-hIiGRknLy6udRsZ52QxJz9cmRKlR4NXbP9rCZDsKn2fDfG ...

  5. WCF学习之旅—第三个示例之四(三十)

           上接WCF学习之旅—第三个示例之一(二十七)               WCF学习之旅—第三个示例之二(二十八)              WCF学习之旅—第三个示例之三(二十九)   ...

  6. WCF学习之旅—第三个示例之五(三十一)

       上接WCF学习之旅—第三个示例之一(二十七)               WCF学习之旅—第三个示例之二(二十八)              WCF学习之旅—第三个示例之三(二十九) WCF学习 ...

  7. WCF学习之旅—第三个示例之二(二十八)

    上接WCF学习之旅—第三个示例之一(二十七) 五.在项目BookMgr.Model创建实体类数据 第一步,安装Entity Framework 1)  使用NuGet下载最新版的Entity Fram ...

  8. WCF学习之旅—WCF服务的WAS寄宿(十二)

    上接    WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一) 八.WAS宿主 IIS ...

  9. WCF学习之旅—WCF服务的批量寄宿(十三)

    上接    WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一) WCF学习之旅—WCF ...

随机推荐

  1. URL安全的Base64编码

    Base64编码可用于在HTTP环境下传递较长的标识信息.在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式.此时,采用Base64编码不仅比较简短,同时也具有不可 ...

  2. 阿里签名中URLEncode于C#URLEncod不同之处

    问题 如上图所示,阿里云的PercentEncode 转换! 为 %21 PercentEncode 源码为: package com.aliyuncs.auth; import java.io.Un ...

  3. BootStrap_02之全局样式及组件

    1.BootStrap指定的四种屏幕尺寸: ①超大PC屏幕--lg(large):w>=1200px: ②中等PC屏幕--md(medium):1200px>w>=992px: ③P ...

  4. HTML文档头部

    前面的话   在声明文档类型之后,HTML文档的下一部分为<html>标签,告知浏览器应将括在<html>...</html>内的所有内容解析为HTML.然后是HT ...

  5. winform异步加载数据到界面

    做一个学习记录. 有两个需求: 1.点击按钮,异步加载数据,不卡顿UI. 2.把获取的数据加载到gridview上面. 对于需求1,2,代码如下: public delegate void ShowD ...

  6. 通过AngularJS实现前端与后台的数据对接(一)——预备工作篇

    最近,笔者在做一个项目:使用AngularJS,从而实现前端与后台的数据对接.笔者这是第一次做前端与后台的数据对接的工作,因此遇到了许多问题.笔者在这些问题中,总结了一些如何实现前端与后台的数据对接的 ...

  7. unity 3d 解析 json

    官网案例传送门 我这里不过是借花献佛,案例官网就有. using UnityEngine; using System.Collections; public class json : MonoBeha ...

  8. redis成长之路——(二)

    redis操作封装 针对这些常用结构,StackExchange.Redis已经做了一些封装,不过在实际应用场景中还必须添加一些功能,例如重试等 所以对一些常功能做了一些自行封装SERedisOper ...

  9. [WPF] Wait for a moment.

    一.控件介绍 在 WPF 中使用的等待控件,控件包括三种,普通的等待信息提示(WaitTip),进度条提示(WaitProgress),以及主程序覆盖的模拟时钟等待窗口(WaitClock),具体效果 ...

  10. 初识JavaScript

    JavaScript ECMA-262: 变量,函数,对象,数据类型....唯独没有输入和输出. Javascript:包含 ECMA-262,核心 BOM 浏览器对象模型, DOM 文档对象模型 什 ...