WCF创建RESTService

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

WCF创建RESTService

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的服务,

WCF创建RESTService

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所在目录即可,

在浏览器中访问结果如下:

WCF创建RESTService

获得了一组Json数据。

关于WCF的REST服务就先介绍到这里,后面的博客会介绍如何来Consume这个服务。

感谢您的阅读,代码点击这里下载。