您的位置:首页 > 其它

WCF创建RESTService

2016-04-11 23:58 387 查看
这篇博客将介绍在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 = 1, Name = "王大锤", Age = 20, Birthday = new DateTime(2012, 12, 31), Gender = true});

_cache.Add(new User() { Id = 2, Name = "张全蛋", Age = 21, Birthday = new DateTime(2012, 12, 31), Gender = true });

_cache.Add(new User() { Id = 3, Name = "赵铁柱", Age = 23, Birthday = new DateTime(2012, 12, 31), Gender = true });

_cache.Add(new User() { Id = 4, Name = "小美", Age = 22, Birthday = new DateTime(2012, 12, 31), 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这个服务。

感谢您的阅读,代码点击这里下载。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: