WCF创建RESTService
这篇博客将介绍在WCF中创建REST服务相关内容。首先先看一下的项目结构:

Contract,Service两个工程为类库工程,需要添加System.ServiceModel, System.ServiceModel.Web, System.Runtime.Serialization名称空间,代码如下:
User Class:
using System;
using System.Runtime.Serialization; namespace Contract
{
[DataContract]
public class User
{
[DataMember]
public int Id { get; set; } [DataMember]
public string Name { get; set; } [DataMember]
public DateTime Birthday { get; set; } [DataMember]
public bool Gender { get; set; } [DataMember]
public int Age { get; set; }
}
}
IUserService
using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.ServiceModel.Web; namespace Contract
{
[ServiceContract]
public interface IUserService
{
[WebGet(UriTemplate="Api/Users",RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
IEnumerable<User> GetAll(); [WebGet(UriTemplate="Api/Users/{id}",RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
User Get(string id); [WebInvoke(UriTemplate="Api/Users/{id}",Method ="DELETE",RequestFormat = WebMessageFormat.Json,ResponseFormat = WebMessageFormat.Json)]
bool Delete(String id); [WebInvoke(UriTemplate ="Api/Users",Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
bool Add(User user); [WebInvoke(UriTemplate ="Api/Users",Method = "PUT",RequestFormat = WebMessageFormat.Json,ResponseFormat =WebMessageFormat.Json)]
bool Update(User user);
}
}
这个和以往普通的WCF服务不一样,在方法名上面的Attribute为WebGet/WebInvoke,请求的参数放置在UriTemplate中。
UserService
using Contract;
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel.Web; namespace Service
{
public class UserService : IUserService
{
private List<User> _cache = new List<User>(); public UserService()
{
_cache.Add(new User() { Id = , Name = "王大锤", Age = , Birthday = new DateTime(, , ), Gender = true}); _cache.Add(new User() { Id = , Name = "张全蛋", Age = , Birthday = new DateTime(, , ), Gender = true }); _cache.Add(new User() { Id = , Name = "赵铁柱", Age = , Birthday = new DateTime(, , ), Gender = true }); _cache.Add(new User() { Id = , Name = "小美", Age = , Birthday = new DateTime(, , ), Gender = false }); } public bool Add(User user)
{
bool result = false; try
{
var first = _cache.FirstOrDefault(u => u.Id == user.Id); if(first == null)
{
_cache.Add(user); result = true; WebOperationContext.Current.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.Created;
}
else
{
result = false;
}
}
catch (Exception)
{
result = false;
} return result;
} public bool Delete(string id)
{
bool result = false; try
{
var first = _cache.FirstOrDefault(u=>u.Id.ToString() == id); if(first != null)
{
_cache.Remove(first); WebOperationContext.Current.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.Created; result = true;
}
else
{
result = false; WebOperationContext.Current.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.NotFound;
}
}
catch (Exception)
{
result = false;
} return result;
} public User Get(string id)
{
var target = _cache.FirstOrDefault(u => u.Id.ToString() == id); WebOperationContext.Current.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK; return target;
} public IEnumerable<User> GetAll()
{
WebOperationContext.Current.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK; return _cache;
} public bool Update(User user)
{
bool result = false; var target = _cache.FirstOrDefault(u => u.Id == user.Id); if(target != null)
{
_cache.Remove(target); _cache.Add(target); WebOperationContext.Current.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK;
}
else
{
WebOperationContext.Current.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.NotFound;
} return result;
}
}
}
模拟实现了一个CURD的REST服务。下面就可以对服务进行承载。介绍两种方式,
1. 控制台程序:
App.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<system.serviceModel>
<services>
<service name="Service.UserService">
<endpoint
address="http://192.168.1.100/UserService"
binding="webHttpBinding"
contract="Contract.IUserService" />
</service>
</services>
</system.serviceModel>
</configuration>
Program.cs
static void Main(string[] args)
{
using (WebServiceHost host = new WebServiceHost(typeof(UserService)))
{
host.Opened += delegate
{
Console.WriteLine("Service is opened.");
}; host.Open(); Console.Read();
}
}
运行服务,在浏览器中访问获取所有User的服务,

2. 在IIS中承载服务,
在Service工程下添加Web.config文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="Service.UserService">
<endpoint address=""
binding="webHttpBinding"
contract="Contract.IUserService"
/>
</service>
</services>
</system.serviceModel>
</configuration>
这里address不需要指定,IIS会分配一个地址给服务。
新建UserService.svc文件,
<%@ ServiceHost Service="Service.UserService" Language="C#" Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>
将Service编译路径指向到Bin目录下。然后再IIS中新建一个Application指向Service所在目录即可,
在浏览器中访问结果如下:

获得了一组Json数据。
关于WCF的REST服务就先介绍到这里,后面的博客会介绍如何来Consume这个服务。
感谢您的阅读,代码点击这里下载。
WCF创建RESTService的更多相关文章
- 使用WCF 创建 Rest service
REST SERVICE 允许客户端修改url路径,并且web端功过url 请求数据. 他使用http协议进行通讯,想必大家都知道 . 并且我们可以通过设置进行数据类型转换, 支持XML,JSON 格 ...
- 用C#基于WCF创建TCP的Service供Client端调用
本文将详细讲解用C#基于WCF创建TCP的Service供Client端调用的详细过程 1):首先创建一个Windows Service的工程 2):生成的代码工程结构如下所示 3):我们将Servi ...
- 利用WCF创建简单的RESTFul Service
1):用VS2013创建一个WCF的工程,如下图所示: 2):我们来看一下默认状态下的config文件内容,这里的内容我们会再后续的步骤中进行修改 <?xml version="1.0 ...
- WCF创建到使用到发布
1,在VS里面新建一个类库项目 2,向类库项目里添加WCF服务文件 3.按照WCF约束规范编写接口和实现类 using System; using System.Collections.Generic ...
- 宿主在Windows Service中的WCF(创建,安装,调用) (host到exe,非IIS)
1. 创建WCF服务 在vs2010中创建WCF服务应用程序,会自动生成一个接口和一个实现类:(IService1和Service1) IService1接口如下: using System.Ru ...
- WCF创建简单程序
1. 新建立空白解决方案,并在解决方案中新建项目,项目类型为:WCF服务应用程序.建立完成后如下图所示: 2.删除系统生成的两个文件IService1.cs与Service1.svc,当然你也可以直接 ...
- WCF 创建WCF
一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NE ...
- C#中使用WCF创建面向网络的服务程序
如题. 这种东西基于微软的一整套东西,在.NET内使用特别方便.利弊自行衡量,是否使用自行决定. 步骤1.创建一组在网上发布的方法 新建项目,类型选择“WCF服务应用程序” 在项目里,你可以补充任意 ...
- WCF 项目应用连载[2] - 创建Lig日志系统
WCF 项目应用连载[1] - 索引 - 轻量级的Log系统 - Lig Sample -序 现在我们创建一个Lig工程 - Litelog 2.1 创建Lig服务 _________________ ...
随机推荐
- UIDynamic-附着行为:UIAttachmentBehavior
直接上代码: // // YFAttachmentBehaviorViewController.m // BigShow1949 // // Created by apple on 16/8/25. ...
- reGeorg v1.0内网流量转发
reGeorg v1.0 git Usage $ reGeorgSocksProxy.py [-h] [-l] [-p] [-r] -u [-v] Socks server for reGeorg H ...
- Notepad++编写Markdown
Markdown语法高亮 下载userDefineLang_markdown.xml 打开Notepad++的 Language 菜单,选中底部的 Define your language... 在 ...
- Bzoj1597 [Usaco2008 Mar]土地购买
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4005 Solved: 1460 Description 农夫John准备扩大他的农场,他正在考虑N ...
- '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp error
'0000-00-00 00:00:00' can not be represented as java.sql.Timestamp error 异常现象 ### Cause: java.sql.SQ ...
- python面向对象初级(七)
概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 面向过程编程最易被初学 ...
- 加载未安装APK中的类
一.前提 目的:动态加载SD卡中Apk的类. 注意:被加载的APK是未安装的. 相关:本文是本博另外一篇文章:Android动态加载jar/dex的升级版. 截图: 成功截图: 二.准备 准备被调用A ...
- Python Day6
面向对象 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强...&qu ...
- mysql索引失效
在做项目的过程中,难免会遇到明明给mysql建立了索引,可是查询还是很缓慢的情况出现,下面我们来具体分析下这种情况出现的原因及解决方法 索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: ...
- springmvc @PathVariable("b") double b 丢失精度问题
Spring MVC从3.0开始支持REST,而主要就是通过@PathVariable来处理请求参数和路径的映射.由于考虑到SEO的缘故,很多人喜欢把新闻的名称作为路径中的一部分去处理,这时候中文的名 ...