初试Asp.Net Web Api

  自Asp.Net Web Api问世以来,一直没有去体验下,有些惭愧。不过在说Web Api之前还是要提一下Rest,Rest的英文全称是:Representational State Transfer,翻译过来就是“表征状态转移”。不过在看到这译过来的6个字,我也迷迷糊糊的,名字为什么这么怪?它是Roy Fielding在2000年的时候在他的论文里面提出的一种软件架构风格。

  REST 从资源的角度来观察整个网络,分布在各处的资源由URI确定,而客户端的应用通过URI来获取资源的表征。获得这些表征致使这些应用程序转变了其状态。随着不断获取资源的表征,客户端应用不断地在转变着其状态。并且Roy Fielding设计良好的网络应用表现为一系列的网页,这些网页可以看作的虚拟的状态机,用户选择这些链接导致下一网页传输到用户端展现给使用的人,而这正代表了状态的转变。关于更多Rest介绍可以移步这里

  Asp.net Web Api有三种使用形式,分别是:1) 自寄宿。2)Asp.net Mvc 。3)Asp.Net Web Form 。本文主要讲解自寄宿形式。

  如果大家没有安装VS2012,那么久让VS2010升级SP1补丁即可,先在VS2010下新建一个空项目解决方案,命名:WebApi,因这里是使用自寄宿形式,所以我是在控制台下面实现的。在解决方案下新增两个控制台项目ApiHost,Client。例子中涉及到操作学生信息,所以新建了一个Model项目,里面含有一个Student实体类。项目结构如下:

  项目新建完之后,我们还要用Nuget工具添加针对Asp.Net Web API自我寄宿相关的引用,操作步骤如下:

  1)如果在VS2010下面没有安装Nuget插件的话,我们可以这样添加

  

  按照这个操作,打开“扩展管理器”,在里面搜索"Nuget"

  

  此时点击安装即可。

  2) 服务端,客户端添加针对Asp.net Web API的引用

  

  接下来会弹出新窗体,在里面搜索"Web API","Self Host"

  

  

  按照上面2步操作,准备工作算是完成了。

  Asp.net Web API 直接借鉴了Asp.net MVC 的设计,两者具有极为相同的编程方式。先在ApiHost项目新建一个Student的Controll,这里的Controll必须继承ApiController,它是一个抽象类,继承IHttpController接口。具体代码如下:

public class StudentController : ApiController
{
        public IList<Student> GetStudentLst()
        {
            return Students;
        }

        public Student GetStudentById(int Id)
        {
            return Students.FirstOrDefault(w => w.ID == Id);
        }

        public void DeleteStudentById(int Id)
        {
            var stu = Students.FirstOrDefault(w => w.ID == Id);
            Students.Remove(stu);
        }


        static IList<Student> Students = new List<Student>() { 
            new Student{ID = 100,Name="tauruswu",Sex="",Grade="大学一年级"},
            new Student{ID = 101,Name="赵文卓",Sex="",Grade="大学四年级"},
            new Student{ID = 102,Name="成东青",Sex="",Grade="大学三年级"},
            new Student{ID = 103,Name="王阳",Sex="",Grade="大学三年级"},
            new Student{ID = 104,Name="孟晓俊",Sex="",Grade="大学一年级"},
            new Student{ID = 105,Name="良琴",Sex="",Grade="大学二年级"}
        };
}

上述代码分别定义了两个Get操作,一个Delete操作。

  对StudentControll的自我寄宿定义在Program里面,如下代码所示,我们针对监听地址http://127.0.0.1:8080创建了一个HttpSelfHostConfiguration对象,并且进行相应路由注册。然后针对HttpSelfHostConfiguration创建一个HttpSelfHostServer对象,调用OpenSync方法启动寄宿的Web API。

static void Main(string[] args)
{
            var baseAddr = new Uri("http://127.0.0.1:8080");
            var hostConfig = new HttpSelfHostConfiguration(baseAddr);
            hostConfig.Routes.MapHttpRoute("ApiService", 
                                            "Api/{Controller}/{Id}",
                                            new { Id = RouteParameter.Optional });

            using (HttpSelfHostServer hostServer = new HttpSelfHostServer(hostConfig))
            {
                hostServer.OpenAsync().Wait();

                Console.WriteLine("已经启动寄宿的Web Api.");
                Console.WriteLine();
                Console.WriteLine("按任意键离开.");
                Console.ReadLine();
            }
}

  在客户端Client项目里面运用HttpClient对象进行Web Api的调用。

    static HttpClient client = new HttpClient();

    static void Main(string[] args)
    {
            client.BaseAddress = new Uri("http://127.0.0.1:8080");

            Console.WriteLine("开始获取所有学生列表:");
            GetStudentLst();
            Console.WriteLine();
            Console.WriteLine("获取学号等于101的学生信息:");
            GetStudentById(101);
            Console.WriteLine();
            Console.WriteLine("删除学号等于102的学生信息:");
            RemoveStaudentBy(102);
            Console.WriteLine();
            Console.WriteLine("获取最新学生列表:");
            GetStudentLst();
            Console.ReadLine();

        }

        static void GetStudentLst()
        {
            HttpResponseMessage resp = client.GetAsync("Api/Student").Result;
            resp.EnsureSuccessStatusCode();

            var students = resp.Content.ReadAsAsync<IList<Student>>().Result;

            foreach(var stu in students)
            {
                Console.WriteLine("学号:{0}  姓名:{1}  性别:{2}  年级:{3}",
                                    stu.ID,stu.Name,stu.Sex,stu.Grade);
            }
        }

        static void GetStudentById(int id)
        {
            HttpResponseMessage resp = client.GetAsync(string.Format("Api/Student/{0}",id)).Result;
            resp.EnsureSuccessStatusCode();

            var stu = resp.Content.ReadAsAsync<Student>().Result;

            Console.WriteLine("学号:{0}  姓名:{1}  性别:{2}  年级:{3}",
                                    stu.ID, stu.Name, stu.Sex, stu.Grade);
            
        }

        static void RemoveStaudentBy(int id)
        {
            client.DeleteAsync(string.Format("Api/Student/{0}", id)).Wait();
     }

我们看下上面的代码,先根据地址http://127.0.0.1:8080创建一个HttpClient对象,并用GetAsync()获取列表,单个信息,用DeleteAsync删除指定学生信息。运行效果图如下

  到这里,一个简单的Web Api示例就结束了,是不是有那种入门很简单的感觉。Web API的调用本质就是一个HTTP请求发送和响应解析的过程,完全可以按照我们熟悉的方式来调用。Asp.net Web API采用了管道式设计,Asp.Net MVC也是如此。

  

posted @ 2013-06-01 16:30  布衣人老白  阅读(617)  评论(0编辑  收藏  举报