ASP.NET Web API本质是由一个进程托管的一组类,需要宿主,这个宿主可以是ASP.NET应用程序,可以是MVC项目,可以是控制台应用程序,也可以是自己定制的宿主。

在VS2012中创建一个"ASP.NET MVC4 Web应用程序",选择"Web API"模版,会为我们自动添加一些相关组件。

App_Start下的WebApiConfig类包含一个Register方法,这在方法中完成Web API的各种配置,默认有一个路由设置:

config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

意思是说,规定的路由格式把接收到的HTTP请求映射到控制器类,并解析路由片段。

WebApiConfig类的Register静态方法终在global.asax中的Application_Start方法中被调用:

WebApiConfig.Register(GlobalConfiguration.Configuration);

还有,在App_Start下还有一个RouteConfig类,它有一个RegisterRoutes方法:

routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );

也最终在global.asax中的Application_Start方法中被调用:

RouteConfig.RegisterRoutes(RouteTable.Routes);

这里的RegisterRoutes是属于ASP.NET MVC的扩展方法,需要注意的是ASP.NET MVC使用的路由类和ASP.NET Web API是完全不同的。

根据模板创建的项目中有一个ValuesController,它继承自ApiController,而ApiController实现IHTTPController这个接口,这个是ASP.NET Web API的核心。ApiController大致做的事包括:

● 选择、运行控制器方法
● 将HTTP请求消息的各元素转换成控制器方法的才做
● 将控制器方法的返回值转换城HTTP响应
● 各种筛选
● 为控制器提供上下文状态

在ValuesController的方法命名规则符合ASP.NET Web API的命名约定,即ApiController会根据HTTP方法谓词找寻对应的方法。比如,Get请求就找Get开头的方法。

创建一个名称为"GreetingController"的空的"api控制器",编写如下:

    public class GreetingController : ApiController
    {
        public string GetGreeting()
        {
            return "Hello World";
        }
    }

运行项目,在浏览器中输入:http://localhost:1790/api/greeting

HTTP调试代理工具Fiddler可以构造并执行HTTP消息,这在以后会经常使用这个工具,在这先玩下。

在"Composer"选项卡输入如下:

双击左侧列表中对应的链接。

在"Inspectors"选项卡下的"Raw"选项卡中看到如下:

ASP.NET Web API还支持内容协商,即客户端请求什么格式,服务端就返回什么格式。

比如客户端要求返回xml格式,那就在Fiddler中构建HTTP请求如下:

然后就能从服务端获取到xml格式的响应。

以上,客户端发出HTTP请求,服务端返回静态信息。

现在让ApiController返回动态信息。

在Models文件夹下创建一个类。

namespace MvcApplication1.Models
{
    public class Greeting
    {
        public string Name { get; set; }
        public string Message { get; set; }
    }
}

在控制器中写一个用来接收客户端Post请求的方法:

        public static List<Greeting> _greetings = new List<Greeting>();

        public HttpResponseMessage PostGreeting(Greeting greeting)
        {
            _greetings.Add(greeting);

            //从请求中获取一些什么
            var greetingLocation = new Uri(this.Request.RequestUri, "greeting/"+greeting.Name);

            //创建响应
            var response = this.Request.CreateResponse(HttpStatusCode.Created);
            response.Headers.Location = greetingLocation;

            return response;
        }

以上,

● HttpResponseMessage是System.Net.Http的一个核心类,用来封装响应信息。
● HttpRequestMessage也是System.Net.Http的一个核心类,用来封装请求信息。
● PostGreeting的形参是Greeting类型,背后隐藏了模型绑定机制,会根据客户端Content-Type标头信息,内部使用MediaTypeFormatter对象处理客户端信息实现模型绑定。
● Request属性类型是HttpRequestMessage。
● HttpResponseMessage的Headers属性让我们可以对标头进行细粒度的控制

再给控制器中的GetGreeting方法写一个重载方法,用来接收带参数的Get请求。

public string GetGreeting(string id)
        {
            var greeting = _greetings.FirstOrDefault(g => g.Name == id);
            return greeting.Message;
        }       

现在,在客户端模拟一个POST请求,以json格式向服务端发出HTTP请求信息:

得到如下的服务端反馈:

然后根据以上Location的值,构建如下HTTP请求:

服务端返回如下:

如果在请求处理过程出现异常该如何处理呢?

ASP.NET Web API为我们提供了HttpResponseException类。

在GetGreeting重载方法中加入处理异常的机制。

        public string GetGreeting(string id)
        {
            var greeting = _greetings.FirstOrDefault(g => g.Name == id);
            if (greeting == null)
            {
                throw new HttpResponseException(HttpStatusCode.NotFound);
            }
            return greeting.Message;
        }

以上,我们使用Fiddler模拟HTTP请求。

也可以在控制台中模拟HTTP请求。创建一个控制台项目。

在控制台项目中引入System.Net.Http组件。

        static void Main(string[] args)
        {
            var greetingServiceAddress = new Uri("http://localhost:1790/api/greeting");

            var client = new HttpClient();
            var result = client.GetAsync(greetingServiceAddress).Result;
            var greeting = result.Content.ReadAsStringAsync().Result;

            Console.WriteLine(greeting);
            Console.ReadKey();
        }

生成控制台项目。

运行,得到如下:

参考资料:ASP.NET Web API设计,from O'RELLY

ASP.NET Web API实践系列09,在Fiddler和控制台中模拟GET和POST请求的更多相关文章

  1. ASP.NET Web API实践系列04,通过Route等特性设置路由

    ASP.NET Web API路由,简单来说,就是把客户端请求映射到对应的Action上的过程.在"ASP.NET Web API实践系列03,路由模版, 路由惯例, 路由设置"一 ...

  2. ASP.NET Web API实践系列07,获取数据, 使用Ninject实现依赖倒置,使用Knockout实现页面元素和视图模型的双向绑定

    本篇接着上一篇"ASP.NET Web API实践系列06, 在ASP.NET MVC 4 基础上增加使用ASP.NET WEB API",尝试获取数据. 在Models文件夹下创 ...

  3. ASP.NET Web API实践系列05,消息处理管道

    ASP.NET Web API的消息处理管道可以理解为请求到达Controller之前.Controller返回响应之后的处理机制.之所以需要了解消息处理管道,是因为我们可以借助它来实现对请求和响应的 ...

  4. ASP.NET Web API实践系列06, 在ASP.NET MVC 4 基础上增加使用ASP.NET WEB API

    本篇尝试在现有的ASP.NET MVC 4 项目上增加使用ASP.NET Web API. 新建项目,选择"ASP.NET MVC 4 Web应用程序". 选择"基本&q ...

  5. ASP.NET Web API实践系列03,路由模版, 路由惯例, 路由设置

    ASP.NET Web API的路由和ASP.NET MVC相似,也是把路由放在RouteTable中的.可以在App_Start文件夹中的WebApiConfig.cs中设置路由模版.默认的路由模版 ...

  6. ASP.NET Web API实践系列02,在MVC4下的一个实例, 包含EF Code First,依赖注入, Bootstrap等

    本篇体验在MVC4下,实现一个对Book信息的管理,包括增删查等,用到了EF Code First, 使用Unity进行依赖注入,前端使用Bootstrap美化.先上最终效果: →创建一个MVC4项目 ...

  7. ASP.NET Web API实践系列01,以ASP.NET Web Form方式寄宿

    创建一个空的ASP.NET Web Form项目. 右键项目,添加新项,创建Web API控制器类,TestController. 删除掉TestController默认的内容,编写如下: using ...

  8. ASP.NET Web API实践系列11,如何设计出优秀的API

    本篇摘自:InfoQ的微信公众号 在设计API的时候考虑的问题包括:API所使用的传输协议.支持的消息格式.接口的控制.名称.关联.次序,等等.我们很难始终作出正确的决策,很可能是在多次犯错之后,并从 ...

  9. ASP.NET Web API 2系列(三):查看WebAPI接口的详细说明及测试接口

    引言 前边两篇博客介绍了Web API的基本框架以及路由配置,这篇博客主要解决在前后端分离项目中,为前端人员提供详细接口说明的问题,主要是通过修改WebApi HelpPage相关代码和添加WebAp ...

随机推荐

  1. Windows运行命令

    winver---------检查Windows版本 wmimgmt.msc----打开windows管理体系结构 wupdmgr--------windows更新程序 winver--------- ...

  2. 八、mini2440裸机程序之UART(2)UART0与PC串口通信【转】

    转自:http://blog.csdn.net/shengnan_wu/article/details/8309417 版权声明:本文为博主原创文章,未经博主允许不得转载. 1.相关原理图 2.相关寄 ...

  3. sort命令的k选项大讨论【转】

    本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. ...

  4. 搜索引擎ElasticSearchV5.4.2系列一之ES介绍

    相关博文: 搜索引擎ElasticSearchV5.4.2系列一之ES介绍 搜索引擎ElasticSearchV5.4.2系列二之ElasticSearchV5.4.2+kibanaV5.4.2+x- ...

  5. 巧用PHP双$功能兼容线上线下配置文件

    2014年2月8日 19:27:05 情景: 开发过程中线上和线下的配置文件中的值是不一样的 例如:线上生产环境的样式域名为ie.style.abc.com,而开发环境为ie.style.abc.ne ...

  6. TcxGrid Sqlite text类型 显示memo

  7. Linix下修改mysql服务器编码

    1. 找到mysql的配置文件,拷贝到etc目录下,第一步很重要 把/usr/share/doc/mysql-server-5.1.52/my-large.cnf 复制到 /etc/my.cnf 即用 ...

  8. ***PHP $_FILES函数详解 + PHP文件上传 move_uploaded_file() 参数的正确写法

    PHP $_FILES函数详解 在PHP中上传一个文件建一个表单要比ASP中灵活得多.具体的看代码. 如:  复制代码代码如下: <form enctype="multipart/fo ...

  9. linux环境vnc安装

    环境:centos6.9 背景:有时安装软件图形化方便操作 1.安装vnc服务端 yum install tigervnc-server -y 2.修改vncserver的配置文件.命令:vim /e ...

  10. kafka 基础知识梳理

    一.kafka 简介 kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据.这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因 ...