Restful风格wcf调用

写在前面

公司有个项目,需要和sharepoint集成,用到了restful,在网上查了一下,wcf方式来实现,还是很方便的,就采用了这种方式,至于web api,没研究过,由于接口急着用,就采用wcf了,用起来也比较顺手。

概念

什么是rest?

REST 描述了一个架构样式的互联系统(如 Web 应用程序)。REST 约束条件作为一个整体应用时,将生成一个简单、可扩展、有效、安全、可靠的架构。由于它简便、轻量级以及通过 HTTP 直接传输数据的特性,RESTful Web 服务成为基于 SOAP 服务的一个最有前途的替代方案。用于 web 服务和动态 Web 应用程序的多层架构可以实现可重用性、简单性、可扩展性和组件可响应性的清晰分离。开发人员可以轻松使用 Ajax 和 RESTful Web 服务一起创建丰富的界面。

REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。

一个例子

新建一个wcf项目。代码如下:

契约

    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together.
    [ServiceContract]
    public interface IUserService
    {
        /// <summary>
        /// 获得所有的用户信息
        /// </summary>
        /// <returns>json或者xml</returns>
        [OperationContract]
        [WebGet(UriTemplate = "api/query", ResponseFormat = WebMessageFormat.Xml)]
        List<UserInfo> QueryList();
        /// <summary>
        /// 根据id查询用户信息
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [OperationContract]
        [WebGet(UriTemplate = "api/querybyid/{id}", ResponseFormat = WebMessageFormat.Json)]
        UserInfo Query(string id);
        /// <summary>
        /// 根据名字查询
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        [OperationContract]
        [WebInvoke(UriTemplate = "api/querybyname/{name}", Method = "GET", ResponseFormat = WebMessageFormat.Xml)]
        UserInfo QueryByName(string name);
        /// <summary>
        /// 根据编号删除用户信息
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [OperationContract]
        [WebInvoke(UriTemplate = "api/delete/{id}", Method = "DELETE", ResponseFormat = WebMessageFormat.Xml)]
        bool Delete(string id);
        /// <summary>
        /// 添加用户信息
        /// </summary>
        /// <param name="userInfo"></param>
        /// <returns></returns>
        [OperationContract]
        [WebInvoke(UriTemplate = "api/add", Method = "POST", ResponseFormat = WebMessageFormat.Xml)]
        bool Insert(UserInfo userInfo);
        /// <summary>
        /// 更新用户信息
        /// </summary>
        /// <param name="userInfo"></param>
        /// <returns></returns>
        [OperationContract]
        [WebInvoke(UriTemplate = "api/modify", Method = "PUT", ResponseFormat = WebMessageFormat.Xml)]
        bool Update(UserInfo userInfo);
    }

服务

    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in code, svc and config file together.
    // NOTE: In order to launch WCF Test Client for testing this service, please select Service1.svc or Service1.svc.cs at the Solution Explorer and start debugging.
    public class UserService : IUserService
    {

        /// <summary>
        /// 获得所有的用户信息
        /// </summary>
        /// <returns>json或者xml</returns>
        public List<UserInfo> QueryList()
        {
            return new List<UserInfo>() {
                new UserInfo() { ID = 1, Name = "wofly", Age = 22, Birthday = DateTime.Now, Gender = true },
                  new UserInfo() { ID = 2, Name = "san zhang", Age = 21, Birthday = DateTime.Now, Gender = true },
                    new UserInfo() { ID = 3, Name = "wukong sun", Age = 23, Birthday = DateTime.Now, Gender = false },
                      new UserInfo() { ID = 4 Name = "zi ma", Age = 45, Birthday = DateTime.Now, Gender = true }
            };
        }
        /// <summary>
        /// 根据id查询用户信息
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public UserInfo Query(string id)
        {

            if (string.IsNullOrEmpty(id))
            {
                throw new ArgumentNullException("id");
            }
            var users = QueryList();
            int iId = Convert.ToInt32(id);
            return users.Where(x => x.ID == iId).FirstOrDefault();
        }
        /// <summary>
        /// 根据编号删除用户信息
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public bool Delete(string id)
        {
               if (string.IsNullOrEmpty(id))
                {
                    throw new ArgumentNullException("id");
                }

            //当前操作上下文
            WebOperationContext woc = WebOperationContext.Current;
            //状态码
            woc.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK;
            try
            {
                var users = QueryList();
                int iId = Convert.ToInt32(id);
                var user = users.Where(x => x.ID == iId).FirstOrDefault();
                return users.Remove(user);
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }
        /// <summary>
        /// 添加用户信息
        /// </summary>
        /// <param name="userInfo"></param>
        /// <returns></returns>
        public bool Insert(UserInfo userInfo)
        {
            throw new NotImplementedException();
        }
        /// <summary>
        /// 更新用户信息
        /// </summary>
        /// <param name="userInfo"></param>
        /// <returns></returns>
        public bool Update(UserInfo userInfo)
        {
            throw new NotImplementedException();
        }

        /// <summary>
        /// 根据名字查询
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public UserInfo QueryByName(string name)
        {
            var users = QueryList();
            return users.Where(x => x.Name.Equals(name)).FirstOrDefault();
        }
    }

用户信息类

    /// <summary>
    /// 用户信息类
    /// </summary>
    [DataContract]
    public class UserInfo
    {
        /// <summary>
        /// 编号
        /// </summary>
        [DataMember]
        public int ID { set; get; }
        /// <summary>
        /// 名字
        /// </summary>
        [DataMember]
        public string Name { set; get; }
        /// <summary>
        /// 性别
        /// </summary>
        [DataMember]
        public bool Gender { set; get; }
        /// <summary>
        /// 年龄
        /// </summary>
        [DataMember]
        public int Age { set; get; }
        /// <summary>
        /// 生日
        /// </summary>
        [DataMember]
        public DateTime Birthday { set; get; }
    }

通过 WCF 4.0 里创建的 WCF Service Application 发布REST服务很简单,只需要在 svc 的 Markup 里加上 Factory:

<%@ ServiceHost Language="C#" Debug="true" Service="Wolfy.WCFRestfuleDemo.UserService" CodeBehind="UserService.svc.cs"  %>

修改后

<%@ ServiceHost Language="C#" Debug="true" Service="Wolfy.WCFRestfuleDemo.UserService" CodeBehind="UserService.svc.cs"  Factory="System.ServiceModel.Activation.WebServiceHostFactory"%>

修改前,浏览svc服务

修改后

注意:UriTemplate 路径段的变量类型必须为“字符串”。

修改后,浏览svc服务

到这里,你应该发现了,WCF的Metadata不能访问了,也就说不能访问svc的wsdl了。

测试

在浏览器中输入:http://localhost:21074/UserService.svc/api/query

到这里已经成功了,那么我们访问一下id为1用户信息

http://localhost:21074/UserService.svc/api/querybyid/1

{"Age":22,"Birthday":"\/Date(1433419746141+0800)\/","Gender":true,"ID":1,"Name":"wofly"}

路由方式访问

看到上面的url,很像mvc的路由,那有没有办法修改成路由访问方式呢?答案是肯定的。只需在全局处理程序中注册路由就可以了。

    public class Global : System.Web.HttpApplication
    {
        protected void Application_Start(object sender, EventArgs e)
        {
            //注册路由
            System.Web.Routing.RouteTable.Routes.Add(
                new System.ServiceModel.Activation.ServiceRoute(
                    "userInfo",
                    new System.ServiceModel.Activation.WebServiceHostFactory(), typeof(UserService)
                ));
        }
    }

使用注册的路由访问服务
http://localhost:21074/userInfo/api/query

总结

这里实现了restful风格的wcf的查询操作,关于增删改(post,delete,put)将在后面的文章中说明。

参考文章:

http://blog.csdn.net/fangxing80/article/details/6235662

时间: 2024-10-20 00:14:30

Restful风格wcf调用的相关文章

Restful风格wcf调用4——权限认证

写在前面 在前面的三篇文章,已经介绍了restful风格wcf,如何实现增删改查以及文件的上传下载操作.本篇文章将介绍一下,调用restful的权限认证的内容.在调用的接口,为了安全,总会需要对请求进行权限认证的.以防一些非法的操作. 系列文章 Restful风格wcf调用 Restful风格wcf调用2——增删改查 Restful风格wcf调用3——Stream 一个例子 在REST WCF中,我们可以利用 HttpHeader 来完成这一目标. 首先我们添加一个校验身份的一个方法. ///

Restful风格wcf调用3——Stream

写在前面 上篇文章介绍了restful接口的增删改查,本篇文章将介绍,如何通过数据流进行文件的上传及下载操作. 系列文章 Restful风格wcf调用 Restful风格wcf调用2——增删改查 一个例子 添加一个wcf服务,并在global.asax中注册路由,并修改svc文件的标记,添加Factory属性. //注册路由 System.Web.Routing.RouteTable.Routes.Add(new System.ServiceModel.Activation.ServiceRou

Restful风格wcf调用2——增删改查

写在前面 上篇文章介绍如何将wcf项目,修改成restful风格的接口,并在上面提供了查询的功能,上篇文章中也感谢园友在评论中的提的建议,自己也思考了下,确实是那个道理.在urltemplate中,定义的url确实不规范,虽然能实现功能,但是缺少点专业性.rest风格的请求,是通过post,delete,get,put等请求方法来区别的,而不是通过在url中取不同的名字来进行区别.这里再次感谢@~Js园友提醒. 在这篇文章中将最新的代码贴出来,方便查看. 系列文章 Restful风格wcf调用 

Wcf体现Restful风格

Wcf体现Restful风格 概述 含状态传输(Representational State Transfer)的软件架构风格.主要特点 1.  资源是由URI来指定: 例如http://example.com/resources/ 2.  对资源的操作 包括获取.创建.修改和删除资源,这些操作正好对应HTTP协议提供的GET.POST.PUT和DELETE方法 3.  传输的资源:Web服务接受与返回的互联网媒体类型,比如:JSON,XML ,YAML 等. 下面通过一个简单的例子逐个问题解决

RESTful风格的Web服务框架:Swagger

Swagger与SpringMVC项目整合 为了方便的管理项目中API接口,在网上找了好多关于API接口管理的资料,感觉目前最流行的莫过于Swagger了,功能强大,UI界面漂亮,并且支持在线测试等等,所以本人仔细研究了下Swagger的使用,下面就如何将Swagger与个人的SpringMVC项目进行整合做详细说明: 最终API管理界面:  详细步骤: Step1:项目中引入相关jar包: <properties> <project.build.sourceEncoding>UT

PHP实现RESTful风格的API实例(一)

(关于Yii2的RESTful教程请看: Yii2框架RESTful API教程) 最近看了一些关于RESTful的资料,自己动手也写了一个RESTful实例,以下是源码 目录详情: restful/ Request.php 数据操作类 Response.php 输出类 index.php 入口文件 .htaccess 重写url Request.php :包含一个Request类,即数据操作类.接收到URL的数据后,根据请求URL的方式(GET|POST|PUT|PATCH|DELETE)对数

Restful风格API接口开发springMVC篇

Restful风格的API是一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制. 在Restful风格中,用户请求的url使用同一个url而用请求方式:get,post,delete,put...等方式对请求的处理方法进行区分,这样可以在前后台分离式的开发中使得前端开发人员不会对请求的资源地址产生混淆和大量的检查方法名的麻烦,形成一个统一的接口. 在Restful风格中,现

在 Docker 上运行一个 RESTful 风格的微服务

tags: Microservice Restful Docker Author: Andy Ai Weibo:NinetyH GitHub: https://github.com/aiyanbo/docker-restful-demo 实现构思 1. 使用 Maven 进行项目构建 2. 使用 Jersey 实现一个 RESTful 风格的微服务 3. 在 Docker 里面执行 mvn package 对项目打包 4. 在 Docker 容器里运行这个微服务 实现一个微服务 场景 & 需求

PHP实现RESTful风格的API实例(二)

接前一篇:PHP实现RESTful风格的API实例(一) Response.php :包含一个Request类,即输出类.根据接收到的Content-Type,将Request类返回的数组拼接成对应的格式,加上header后输出 <?php /** * 输出类 */ class Response { const HTTP_VERSION = "HTTP/1.1"; //返回结果 public static function sendResponse($data) { //获取数据