现在的位置: 首页 > 综合 > 正文

HelloWord! (一) 搭建简单的REST Service — Service

2013年12月09日 ⁄ 综合 ⁄ 共 4014字 ⁄ 字号 评论关闭

最近在工作中,项目里有用到REST 服务获取数据,这种ROA(面向资源)框架设计非常轻量,Client端调用也非常简便。相比之前WCF模式要简单和方便的多,话不多说,直接上代码吧。

实体:

namespace H.BizEntity.MyREST
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.Text;
    using System.Threading.Tasks;
    using System.Xml.Serialization;

    [DataContract]
    public class MyRESTEntity
    {
        /// <summary>
        /// 系统编号
        /// </summary>
        [DataMember]
        public int SysNo { get; set; }

        [DataMember]
        public string LoginName { get; set; }

        [DataMember]
        public string LoginPasswd { get; set; }

        [DataMember]
        public DateTime? RegisterDate { get; set; }

        [DataMember]
        public DateTime? InDate { get; set; }
    }
}

 

这次搭建利用 MVC 路由方式添加 Service 节点..

新建一个Web项目

项目里只需要一个Global.asax 文件就行了. 本次演示中通过Config配置来加载创建REST Service

最终会执行下列代码进行ROUTE添加

//方便全局信息处理,使用了工厂类进行处理。
            WebServiceHostFactory factory = new RestWebServiceHostFactory(customBizExceptionTypeName);
            //此处是根据Config 配置信息获取 REST Service
            //获取数据格式:
            //<serviceList>
	        //  <service path="MyRESTService" type="H.Service.Restful.MyREST.MyRESTService, H.Service.Restful" />
            //</serviceList>
            List<ServiceData> list = ServiceConfig.GetAllService();
            foreach (ServiceData de in list)
            {
                string routePrefix = (de.Path == null ? string.Empty : de.Path.Trim());
                Type serviceType = Type.GetType(de.Type.Trim(), true);
                //添加到路由
                RouteTable.Routes.Add(new ServiceRoute(routePrefix, factory, serviceType));
            }

IISHost 已经添加好了,接下来看贴上Service 代码

namespace H.Service.Restful.MyREST
{
    using H.BizEntity;
    using H.BizEntity.MyREST;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.ServiceModel;
    using System.ServiceModel.Activation;
    using System.ServiceModel.Web;
    using System.Text;
    using System.Threading.Tasks;
    
    [ServiceContract]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single, AddressFilterMode = AddressFilterMode.Any)]
    public partial class MyRESTService
    {
        List<MyRESTEntity> entityList = new List<MyRESTEntity>();

        public MyRESTService()
        {
            for (int i = 0; i < 5; i++)
            {
                entityList.Add(new MyRESTEntity()
                {
                    InDate = DateTime.Now,
                    LoginName = "Test" + i,
                    LoginPasswd = "TestPwd" + i,
                    RegisterDate = DateTime.Now,
                    SysNo = i + 1
                });
            }
        }

        #region 获取数据List
        [WebInvoke(UriTemplate = "/GET/GetDataToJson", Method = "GET", ResponseFormat = WebMessageFormat.Json)]
        public List<MyRESTEntity> GetDataToJsonList()
        {
            //throw new BizException("出错了!");

            var user = GetHeaderValue("user");
            var pwd = GetHeaderValue("pwd");  

            return entityList;
        }

        private string GetHeaderValue(string name)
        {
            return WebOperationContext.Current.IncomingRequest.Headers.Get(name); 
        }

        [WebInvoke(UriTemplate = "/GET/GetDataToXml", Method = "GET", ResponseFormat = WebMessageFormat.Xml)]
        public List<MyRESTEntity> GetDataToXmlList()
        {
            throw new Exception();
            return entityList;
        }
        #endregion

        #region 获取指定SysNo Entity
        [WebInvoke(UriTemplate = "/GET/GetDataToJson/{SysNo}", Method = "GET", ResponseFormat = WebMessageFormat.Json)]
        public MyRESTEntity GetDataToJsonBySysNo(string sysNo)
        {
            return entityList.Find(result => { return result.SysNo.ToString() == sysNo; });
        }

        [WebInvoke(UriTemplate = "/GET/GetDataToXml/{SysNo}", Method = "GET", ResponseFormat = WebMessageFormat.Xml)]
        public MyRESTEntity GetDataToXmlBySysNo(string sysNo)
        {
            return entityList.Find(result => { return result.SysNo.ToString() == sysNo; });
        }
        #endregion

        /// <summary>
        /// 创建
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        [WebInvoke(UriTemplate = "/CREATE/CreateMyREST", Method = "POST", ResponseFormat = WebMessageFormat.Json)]
        public MyRESTEntity CreateMyREST(MyRESTEntity entity)
        {
            entity.SysNo = 8;
            return entity;
        }

        /// <summary>
        /// 更新
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        [WebInvoke(UriTemplate = "/UPDATE/UpdateMyREST", Method = "PUT", ResponseFormat = WebMessageFormat.Json)]
        public MyRESTEntity UpdateMyREST(MyRESTEntity entity)
        {
            entity.SysNo = 8;
            return entity;
        }

        /// <summary>
        /// 删除
        /// 此处考虑删除操作传递的是对象,所以Method = PUT , 如果只针对 单个变量传递过来的话,DELETE 方式更为合适..
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        [WebInvoke(UriTemplate = "/DELETE/DeleteMyREST", Method = "PUT", ResponseFormat = WebMessageFormat.Json)]
        public MyRESTEntity DeleteMyREST(MyRESTEntity entity)
        {
            entity.SysNo = 8;
            return entity;
        }

    }
}

 

REST Service 搭建好了。运行前面建好的Web项目。然后后面加上Services名称+方法UriTemplate 指定的名称

Json方式


Xml 方式

抱歉!评论已关闭.