【ASP.NET Web API2】初识Web API
Web Api 是什么?
MSDN:ASP.NET Web API 是一种框架,用于轻松构建可以访问多种客户端(包括浏览器和移动设备)的 HTTP 服务
百度百科:Web API是网络应用程序接口。
个人理解:Web API 是提供给多种客户端对data做CRUD(增删查改)操作的统一接口
-------------------------------------------
Asp.net Web API 支持多种寄宿方式
1,IIS作为宿主(创建一个Asp.net web应用程序作为Web API 的宿主)
2,自宿主(不需要IIS支持,使用任意的应用程序作为宿主【控制台、Windows Forms、WPF甚至Windows Service】)
看了Artech大神的一小节Web API,记录一下学到的东西
[构建简单的Web API]
1,以Web Host方式寄宿Web API
Visual Studio 为我们提供了专门用于创建ASP.NET Web API应用的项目模板,我们可以一键式创建一个完整的APS.NET Web API项目。
这里先不使用Visual Studio自动创建的。我们完全在创建的空项目中编写我们的程序。
1.1 构建解决方案
- API: 一个空的类库项目,表现为HttpController类型的Web API就定义在此项目中
- Model:一个空的类库项目,实体类定义在这里
- WebHost:一个空的ASP.NET Web应用程序
1.2 定义Web API
在正式定义Web API 之前,我们需要在项目Model中定义一个代表联系人的实体类Contact,这里做简单的定义
public class Contact
{
public string ID { get; set; } public string Name { get; set; } public string PhoneNum { get;set; } }
Web API定义在API项目中,需要继承ApiController,ApiController定义在程序集“System.Web.Http.dll”, 程序集在“C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET Web Stack 5\Packages\Microsoft.AspNet.WebApi.Core.5.0.0\lib\net45”可以找到
在ContactsController中,我们定义了Get、Post、Put、Delete这4个Action,它们分别实现了针对联系人的查询、添加、修改、删除操作。Action方法Get具有一个表示联系人ID的可缺省参数,如果该参数存在则返回对应的联系人,否则返回整个联系人列表。由于ASP.NET Web API默认实现了Action方法与HTTP方法的映射,所以方法名也体现了它们各自能处理的请求必须采用HTTP方法
public class ContactsController : ApiController
{
List<Contact> contacts;
public ContactsController()
{
contacts = new List<Contact>();
contacts.Add(new Contact() { ID = "001", Name = "小白", PhoneNum = "13529093839" });
contacts.Add(new Contact() { ID = "002", Name = "大白", PhoneNum = "13529093838" });
contacts.Add(new Contact() { ID = "003", Name = "小黑", PhoneNum = "13529088838" });
} public IEnumerable<Contact> Get(string id=null) {
return from c in contacts
where c.ID==id||string.IsNullOrEmpty(id)
select c;
} public void Post(Contact item) {
contacts.Add(item);
} public void Put(Contact item) {
contacts.Remove(contacts.First(c => c.ID == item.ID));
contacts.Add(item);
} public void Delete(string id) {
contacts.Remove(contacts.First(c => c.ID == id));
}
}
1.3 将WebHost作为Web API的宿主
WebHost在解决方案中是一个空的ASP.NET Web应用程序,我们还需要为其添加一些必需的程序集引用。
- System.Web.Http;(\Microsoft.AspNet.WebApi.Core.5.0.0\lib\net45)
- System.Web.Http.WebHost;(\Microsoft.AspNet.WebApi.WebHost.5.0.0\lib\net45)
- System.Net.Http;
- System.Net.Http.Formatting;(\Microsoft.AspNet.WebApi.Client.5.0.0\lib\net45)
我们需要在WebHost项目中添加一个Global.asax全局配置文件,注册一个默认路由,路由系统会解析当前请求访问的目标HttpController和Action的名称
protected void Application_Start(object sender, EventArgs e)
{
GlobalConfiguration.Configuration.Routes.MapHttpRoute(
name: "Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
路由规则中没有表示目标Action的路由参数,ASP.NET Web API如何根据请求确定哪个Action方法应该被调用呢?其实它能根据请求采用HTTP方法来确定目标Action方法。当然在注册路由模板中提供代表Action名称的路由参数({action})也是支持的。
现在Web API的以WebHost为宿主的工作就完成了,我们可以利用浏览器来调用寄宿的Web API来判断寄宿工作是否成功。由于浏览器在默认情况下访问我们在地址栏中输入的地址总是采用HTTP-GET请求,所以我们只能利用它来调用支持HTTP-GET的Action方法,即定义在ContactsController中的Get方法。
采用Chrome浏览器可以看到我们获取的联系人列表是XML格式的数据表示,对于ASP.NET Web API 来说,它会优先利用请求报头"Accept"携带的媒体类型来确定相应内容应用的表现形式。
如下所示是Chrome访问“http://localhost:3697/api/contacts/001”发送请求的内容,它之所以会得到以XML表示的响应是因为“Accept”报头指定的媒体类型列表中只有“application/xml”被ASP.NET Web API支持。如果我们使用IE,请求的“Accept”报头将携带不同的媒体类型列表,我们实际上会得到以JSON格式表示的响应结果
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:max-age=0
Host:localhost:3697
Proxy-Connection:keep-alive
User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36
我们利用Fiddler来发送调用Web API的HTTP请求,获取以JSON格式表示的响应结果。
如图,利用Fiddler发送了一个针对目标地址"http://localhost:3697/api/contacts/001"的Http-GET请求,并添加了一个值为"application/json"的“Accept”报头,Execute发送请求之后确实得到了Json格式表示的联系人列表
使IIS支持Put和Delete请求
在定义ContactsController的时候,我们分别采用Get、Post、Put、Delete作为获取、创建、修改和删除联系人的操作所支持的HTTP方法。但是IIS默认是不支持Put和Delete请求的
IIS拒绝PUT和DELETE请求是由默认注册的一个名为"WebDAVModule"的自定义HttpModule导致的。解决这个问题最为直接的方式就是将注册的HttpModule移除
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule"/>
</modules>
</system.webServer>
2,自宿主的方式寄宿Web API
我们在原来的解决方案中添加一个空的控制台应用程序SelfHost作为宿主
跟WebHost一样,引用解决方案中的API.dll,同样需要应用一些必需的程序集(红色为与WebHost不同的)
- System.Web.Http;(\Microsoft.AspNet.WebApi.Core.5.0.0\lib\net45)
- System.Web.Http.SelfHost;(\Microsoft.AspNet.WebApi.SelfHost.5.0.0\lib\net45)
- System.Net.Http;
- System.Net.Http.Formatting;(\Microsoft.AspNet.WebApi.Client.5.0.0\lib\net45)
通过前面的WebHost,我们知道接下来需要做的是注册路由了。在此之前我们还需要动态加载解决方案中的程序集API.dll,
下面是Artech大神在 【在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用 】中写的, 有个错误的地方httpServer.OpenAsync()后没有执行Wait()方法,导致计算机并未分配一个端口给程序,这让我折腾了好久,不过也学到了其他知识,比如:[如何查看计算机某个端口被谁占用]
static void Main(string[] args)
{
Assembly.Load("API,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null");
HttpSelfHostConfiguration configuration = new HttpSelfHostConfiguration("http://127.0.0.1:7304");
using (HttpSelfHostServer httpServer = new HttpSelfHostServer(configuration))
{
httpServer.Configuration.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional });
httpServer.OpenAsync();//纠正:httpServer.OpenAsync().Wait();
Console.Read();
}
}
当我们没有执行Wait()方法时,查看一下计算机是否有分配端口
1,首先调出命令窗口:开始---->运行---->cmd,或者是window+R组合键
2,输入命令:netstat -ano,可以看到所有端口的情况。发现找了几百遍也是找不到7304端口的
如果你加了Wait(),运行后出现
“HTTP 无法注册 URL http://+:****/。进程不具有此命名空间的访问权限(有关详细信息,请参见 http://go.microsoft.com/fwlink/?LinkId=70353)”
你只要以管理员的身份打开Visual Studio就可以了
【ASP.NET Web API2】初识Web API的更多相关文章
- [水煮 ASP.NET Web API2 方法论](1-5)ASP.NET Web API Scaffolding(模板)
问题 我们想快速启动一个 ASP.NET Web API 解决方案. 解决方案 APS.NET 模板一开始就支持 ASP.NET Web API.使用模板往我们的项目中添加 Controller,在我 ...
- 【Web API2】ASP.NET Web API Security
实现安全的方式既可以是host提供,也可以框架提供. 1,HTTP Module 方式,工作在IIS上,所以web api要托管在IIS上才行.其作用于HTTP管道的最前端,所以这种方式影响的是全局, ...
- Dependency Injection in ASP.NET Web API 2 (在web api2 中使用依赖注入)
原文:http://www.asp.net/web-api/overview/advanced/dependency-injection 1 什么是依赖注入(Dependency Injection) ...
- [水煮 ASP.NET Web API2 方法论](1-1)在MVC 应用程序中添加 ASP.NET Web API
问题 怎么样将 Asp.Net Web Api 加入到现有的 Asp.Net MVC 项目中 解决方案 在 Visual Studio 2012 中就已经把 Asp.Net Web Api 自动地整合 ...
- [水煮 ASP.NET Web API2 方法论](1-2)在 WebForm 应用程序中添加 ASP.NET Web API
问题 怎么样将 Asp.Net Web Api 加入到 Asp.Net Web From 应用程序中 解决方案 在 Visual Studio 2013 中,创建新的 Web From,可以直接在&q ...
- [水煮 ASP.NET Web API2 方法论](3-9)空气路由的设置
阅读导航 问题 解决方案 工作原理 代码演示 在此解释一下,空气路由,是本人臆想出来,觉着更能表达 IgnoreRoute 的意图,如果看着辣眼睛^^,请见谅. 问题 我们在之定义过集中式路由,集中式 ...
- asp.net web api2.0 ajax跨域解决方案
asp.net web api2.0 ajax跨域解决方案 Web Api的优缺点就不说了,直接说怎么跨域,我搜了一下,主要是有两种. 一,ASP.NET Web API支持JSONP,分两种 1, ...
- ASP.NET MVC View 和 Web API 的基本权限验证
ASP.NET MVC 5.0已经发布一段时间了,适应了一段时间,准备把原来的MVC项目重构了一遍,先把基本权限验证这块记录一下. 环境:Windows 7 Professional SP1 + Mi ...
- 如何将一个 ASP.NET MVC 4 和 Web API 项目升级到 ASP.NET MVC 5 和 Web API 2
----转自微软官网www.asp.net/mvc/ ASP.NET MVC 5 和 Web API 2 带来的新功能,包括属性路由. 身份验证筛选器,以及更多的主机.请参阅http://www.as ...
- 从头编写 asp.net core 2.0 web api 基础框架 (1)
工具: 1.Visual Studio 2017 V15.3.5+ 2.Postman (Chrome的App) 3.Chrome (最好是) 关于.net core或者.net core 2.0的相 ...
随机推荐
- Linux Shell编程 sed命令
概述 sed 是一种几乎可以应用在所有 UNIX 平台(包括 Linux)上的轻量级流编辑器,体积小.所以,它可以对从如管道这样的标准输入中接收的数据进行编辑. sed 主要是用来将数据进行选取.替换 ...
- Shell 条件判断总结
-b file 若文件存在且是一个块特殊文件,则为真 -c file 若文件存在且是一个字符特殊文件,则为真 -d file 若文件存在且是一个目录,则为真 -e file 若文件存在,则为真 -f ...
- 函数---迭代器&生成器&列表解析&三元表达式
可迭代对象:obj.__iter__ 迭代器:iter1=obj.__iter() 1iter1.__next__ 2iter2.__next__ 迭代器: 优点:不依赖索引 ...
- python对象类型----数字&字符串
一数据类型: float: 1.3e-3 1.3*10的负三次方 print (1.3e-3) bin() #转换为二进进制 oct() #转换为8进制 hex()#转 ...
- php自带函数去除html标记
strip_tags 去掉 HTML 及 PHP 的标记. 语法: string strip_tags(string str); 传回值: 字串 函式种类: 资料处理 内容说明 本函式可去掉字串中包含 ...
- 跨平台移动开发_PhoneGap API 事件类型
PhoneGap API Events backbuttondevicereadymenubuttonpauseresumeonlineofflinebatterycriticalbatterylow ...
- Linux设置默认启动命令行,而不是图形界面
无论是作为上线的服务器还是开发中的虚拟机来说,都是没有必要启动图形界面的,而图形界面占用的内存还是很大的.枫竹梦本文就介绍如何设置来默认启动命令行. 其实就是设置系统的启动级别. CentOS的设置 ...
- js字符串和数组的相互转化
一.数组转字符串 需要将数组元素用某个字符连接成字符串,示例代码如下: var a, b; a = new Array(0,1,2,3,4); b = a.join("-"); 二 ...
- 快速的熟悉一个angular的项目从run看起
config之类的都会注入到controller或者run里边
- js的set和get
'use strict' class Student { constructor(_name,age){ this.name = _name; this.age = age; } set name(_ ...