初试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 @   布衣人老白  阅读(621)  评论(0编辑  收藏  举报
编辑推荐:
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
阅读排行:
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· PPT革命!DeepSeek+Kimi=N小时工作5分钟完成?
· What?废柴, 还在本地部署DeepSeek吗?Are you kidding?
· 赶AI大潮:在VSCode中使用DeepSeek及近百种模型的极简方法
· DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地
点击右上角即可分享
微信分享提示