WCF学习之旅—实现支持REST服务端应用(二十三)
在上一篇(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处的
- using SCF.Model;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.ServiceModel;
- using System.ServiceModel.Web;
- using System.Text;
- using System.Threading.Tasks;
- namespace SCF.Contracts
- {
- [DataContractFormat]
- [ServiceContract]
- public interface IBookRestService
- {
- //[WebGet(UriTemplate = "/Books/Get/{BookId}/{categroy}", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
- [WebGet(UriTemplate = "/Books/Get/{BookId}", BodyStyle = WebMessageBodyStyle.Bare)]
- [OperationContract]
- List<Books> GetBook(string BookId);
- //[WebInvoke(Method = "POST", UriTemplate = "/Books/Create", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
- [WebInvoke(Method = "POST", UriTemplate = "/Books/Add", BodyStyle = WebMessageBodyStyle.Bare)]
- [OperationContract]
- Result AddBook(Books book);
- }
- }
2. 在项目SCF.Model中创建一个实体对象Books与一个返回对象Result,用作数据传输的载体,下面是Books.cs的内容
- namespace SCF.Model
- {
- using System;
- using System.Collections.Generic;
- using System.ComponentModel.DataAnnotations;
- using System.ComponentModel.DataAnnotations.Schema;
- using System.Data.Entity.Spatial;
- using System.Runtime.Serialization;
- ///DataContract 数据契约:服务端和客户端之间要传送的自定义数据类型
- [DataContract(Namespace = "http://tempuri.org/")]
- public partial class Books
- {
- /// <summary>
- /// 在数据传送过程中,只有成员变量可以被传送而成员方法不可以。
- /// 并且只有当成员变量加上DataMember时才可以被序列进行数据传输,
- /// 如果不加DataMember,客户端将无法获得该属性的任何信息
- /// </summary>
- [DataMember]
- [Key]
- public int BookID { get; set; }
- [DataMember]
- [Required]
- public string Category { get; set; }
- [DataMember]
- [Required]
- public string Name { get; set; }
- [DataMember]
- public int Numberofcopies { get; set; }
- [DataMember]
- public int AuthorID { get; set; }
- [DataMember]
- public decimal Price { get; set; }
- [DataMember]
- public DateTime PublishDate { get; set; }
- [StringLength()]
- [DataMember]
- public string Rating { get; set; }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Runtime.Serialization;
- using System.Text;
- using System.Threading.Tasks;
- namespace SCF.Model
- {
- [DataContract(Namespace = "http://tempuri.org/")]
- public class Result
- {
- [DataMember]
- public string Message
- { get; set; }
- }
- }
3. 在SCF.WcfService项目中实现在SCF.Contracts项目中定义的服务契约。这里最简单的实现GetBook和AddBook两个方法的逻辑。
- using SCF.Contracts;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Runtime.Serialization;
- using System.ServiceModel;
- using System.Text;
- using SCF.Model;
- using SCF.Common;
- namespace SCF.WcfService
- {
- // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“BookRestService”。
- // 注意: 为了启动 WCF 测试客户端以测试此服务,请在解决方案资源管理器中选择 BookRestService.svc 或 BookRestService.svc.cs,然后开始调试。
- public class BookRestService : IBookRestService
- {
- Entities db = new Entities();
- public Result AddBook(Books book)
- {
- Result result = new Result();
- try
- {
- db.Books.Add(book);
- db.SaveChanges();
- result.Message = string.Format("书名:{0} 已经添加!",book.Name);
- }
- catch (Exception ex)
- {
- result.Message =ex.Message;
- }
- return result;
- }
- public List<Books> GetBook(string BookId)
- {
- var cateLst = new List<string>();
- var cateQry = from d in db.Books
- orderby d.Category
- select d.Category;
- cateLst.AddRange(cateQry.Distinct());
- var books = from m in db.Books
- select m;
- if (!String.IsNullOrEmpty(BookId))
- {
- books = books.Where(s => s.Name.Contains(BookId));
- }
- List<Books> list = null;
- list = books.ToList<Books>();
- return list;
- }
- }
- }
4. 在配置文件在中配置我们的Rest服务,必须使用WebHttpBehavior对服务的终结点进行配置。
- <?xml version="1.0" encoding="utf-8"?>
- <configuration>
- <configSections>
- <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
- <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework,
Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />- </configSections>
- <entityFramework>
- <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
- <providers>
- <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
- </providers>
- </entityFramework>
- <system.serviceModel>
- <bindings>
- <webHttpBinding>
- <binding name="RestWebBinding">
- </binding>
- </webHttpBinding>
- </bindings>
- <behaviors>
- <serviceBehaviors>
- <behavior name="metadataBehavior">
- <serviceMetadata httpGetEnabled="true" httpGetUrl="http://127.0.0.1:8888/BookService/metadata" />
- <serviceDebug includeExceptionDetailInFaults="True" />
- </behavior>
- <behavior name="RestServiceBehavior">
- </behavior>
- </serviceBehaviors>
- <endpointBehaviors>
- <behavior name="RestWebBehavior">
- <!--这里必须设置-->
- <webHttp />
- </behavior>
- </endpointBehaviors>
- </behaviors>
- <services>
- <service behaviorConfiguration="metadataBehavior" name="SCF.WcfService.BookService">
- <endpoint address="http://127.0.0.1:8888/BookService" binding="wsHttpBinding"
- contract="SCF.Contracts.IBookService" />
- </service>
- <service name="SCF.WcfService.BookRestService" behaviorConfiguration="RestServiceBehavior">
- <endpoint address="http://127.0.0.1:8888/" behaviorConfiguration="RestWebBehavior"
- binding="webHttpBinding" bindingConfiguration="RestWebBinding" contract="SCF.Contracts.IBookRestService">
- </endpoint>
- </service>
- </services>
- </system.serviceModel>
- <startup>
- <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
- </startup>
- <connectionStrings>
- <add name="Entities" connectionString="metadata=res://*/BookModel.csdl|res://*/BookModel.ssdl|res://*/BookModel.msl;
provider=System.Data.SqlClient;provider connection string="data source=.\SQLEXPRESS;initial catalog=Test;
integrated security=SSPI;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />- </connectionStrings>
- </configuration>
WCF学习之旅—实现支持REST服务端应用(二十三)的更多相关文章
- WCF学习之旅—实现支持REST客户端应用(二十四)
WCF学习之旅—实现REST服务(二十二) WCF学习之旅—实现支持REST服务端应用(二十三) 在上二篇文章中简单介绍了一下RestFul与WCF支持RestFul所提供的方法,及创建一个支持RES ...
- WCF学习之旅—第三个示例之三(二十九)
上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) 在上一篇文章中我们创建了实体对象与接口协定,在这一篇文章中我们来学习如何创建WCF的服务端代码.具体步骤见下面. ...
- WCF学习之旅—第三个示例之一(二十七)
一.前言 通过前面二十几个章节的学习,我们知道了什么是WCF:WCF中的A.B.C:WCF的传输模式:WCF的寄宿方式:WCF的异常处理.本文综合应用以上知识点,一步一步写一个小的WCF应用程序——书 ...
- 一、WCF学习之旅-创建第一个服务
WCF基本介绍:http://baike.baidu.com/link?url=TGjLYt3HS4dt4-hIiGRknLy6udRsZ52QxJz9cmRKlR4NXbP9rCZDsKn2fDfG ...
- WCF学习之旅—第三个示例之四(三十)
上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) WCF学习之旅—第三个示例之三(二十九) ...
- WCF学习之旅—第三个示例之五(三十一)
上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) WCF学习之旅—第三个示例之三(二十九) WCF学习 ...
- WCF学习之旅—第三个示例之二(二十八)
上接WCF学习之旅—第三个示例之一(二十七) 五.在项目BookMgr.Model创建实体类数据 第一步,安装Entity Framework 1) 使用NuGet下载最新版的Entity Fram ...
- WCF学习之旅—WCF服务的WAS寄宿(十二)
上接 WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一) 八.WAS宿主 IIS ...
- WCF学习之旅—WCF服务的批量寄宿(十三)
上接 WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一) WCF学习之旅—WCF ...
随机推荐
- URL安全的Base64编码
Base64编码可用于在HTTP环境下传递较长的标识信息.在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式.此时,采用Base64编码不仅比较简短,同时也具有不可 ...
- 阿里签名中URLEncode于C#URLEncod不同之处
问题 如上图所示,阿里云的PercentEncode 转换! 为 %21 PercentEncode 源码为: package com.aliyuncs.auth; import java.io.Un ...
- BootStrap_02之全局样式及组件
1.BootStrap指定的四种屏幕尺寸: ①超大PC屏幕--lg(large):w>=1200px: ②中等PC屏幕--md(medium):1200px>w>=992px: ③P ...
- HTML文档头部
前面的话 在声明文档类型之后,HTML文档的下一部分为<html>标签,告知浏览器应将括在<html>...</html>内的所有内容解析为HTML.然后是HT ...
- winform异步加载数据到界面
做一个学习记录. 有两个需求: 1.点击按钮,异步加载数据,不卡顿UI. 2.把获取的数据加载到gridview上面. 对于需求1,2,代码如下: public delegate void ShowD ...
- 通过AngularJS实现前端与后台的数据对接(一)——预备工作篇
最近,笔者在做一个项目:使用AngularJS,从而实现前端与后台的数据对接.笔者这是第一次做前端与后台的数据对接的工作,因此遇到了许多问题.笔者在这些问题中,总结了一些如何实现前端与后台的数据对接的 ...
- unity 3d 解析 json
官网案例传送门 我这里不过是借花献佛,案例官网就有. using UnityEngine; using System.Collections; public class json : MonoBeha ...
- redis成长之路——(二)
redis操作封装 针对这些常用结构,StackExchange.Redis已经做了一些封装,不过在实际应用场景中还必须添加一些功能,例如重试等 所以对一些常功能做了一些自行封装SERedisOper ...
- [WPF] Wait for a moment.
一.控件介绍 在 WPF 中使用的等待控件,控件包括三种,普通的等待信息提示(WaitTip),进度条提示(WaitProgress),以及主程序覆盖的模拟时钟等待窗口(WaitClock),具体效果 ...
- 初识JavaScript
JavaScript ECMA-262: 变量,函数,对象,数据类型....唯独没有输入和输出. Javascript:包含 ECMA-262,核心 BOM 浏览器对象模型, DOM 文档对象模型 什 ...