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的更多相关文章

  1. [水煮 ASP.NET Web API2 方法论](1-5)ASP.NET Web API Scaffolding(模板)

    问题 我们想快速启动一个 ASP.NET Web API 解决方案. 解决方案 APS.NET 模板一开始就支持 ASP.NET Web API.使用模板往我们的项目中添加 Controller,在我 ...

  2. 【Web API2】ASP.NET Web API Security

    实现安全的方式既可以是host提供,也可以框架提供. 1,HTTP Module 方式,工作在IIS上,所以web api要托管在IIS上才行.其作用于HTTP管道的最前端,所以这种方式影响的是全局, ...

  3. Dependency Injection in ASP.NET Web API 2 (在web api2 中使用依赖注入)

    原文:http://www.asp.net/web-api/overview/advanced/dependency-injection 1 什么是依赖注入(Dependency Injection) ...

  4. [水煮 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 自动地整合 ...

  5. [水煮 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 ...

  6. [水煮 ASP.NET Web API2 方法论](3-9)空气路由的设置

    阅读导航 问题 解决方案 工作原理 代码演示 在此解释一下,空气路由,是本人臆想出来,觉着更能表达 IgnoreRoute 的意图,如果看着辣眼睛^^,请见谅. 问题 我们在之定义过集中式路由,集中式 ...

  7. asp.net web api2.0 ajax跨域解决方案

    asp.net web api2.0 ajax跨域解决方案 Web Api的优缺点就不说了,直接说怎么跨域,我搜了一下,主要是有两种.  一,ASP.NET Web API支持JSONP,分两种 1, ...

  8. ASP.NET MVC View 和 Web API 的基本权限验证

    ASP.NET MVC 5.0已经发布一段时间了,适应了一段时间,准备把原来的MVC项目重构了一遍,先把基本权限验证这块记录一下. 环境:Windows 7 Professional SP1 + Mi ...

  9. 如何将一个 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 ...

  10. 从头编写 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的相 ...

随机推荐

  1. java Excel导入导出工具类

    本文章,导入导出依赖提前定义好的模板 package com.shareworx.yjwy.utils; import java.io.File; import java.io.FileInputSt ...

  2. [原创]spring及springmvc精简版--AOP

    接上一篇:[原创]spring及springmvc精简版--IOC 理解AOP.java是一种面向对象的语言.而AOP是面向切面,在我看来是面向逻辑或者业务编程,它是对一组逻辑的抽象和分配. 经典例子 ...

  3. 安装Discuz开源论坛

    11.添加mysql普通用户 接着上篇的lamp这篇安装Discuz 配置虚拟主机 1.打开虚拟主机配置 [root@NFS-31 ~]# vim /usr/local/apache2/conf/ht ...

  4. 在IOS开发中,项目的目录结构如何搭建?

    网上有很多关于IOS开发的学习资料.然而却很少有关于设计一个项目时,如何设计其目录结构?这对于自学IOS的程序猿们,无疑有诸多不利.接下来,我就简单的谈下真正在公司中,项目的目录结构如何搭建: 以上为 ...

  5. photoshop cs5 序列号永久序列号永久激活破解方法

    photoshop cs5 序列号永久序列号永久激活破解方法 (2016-12-10 07:52:21) 转载▼ 标签: it   PhotoShop CS5 /ps5  序列号激活码 1330-15 ...

  6. QFile操作文件

    1.构造QFile对象 QFile file("C:\a.txt"); 或者 QFile *file = new QFile("C:\a.txt"); 2.设置 ...

  7. 【codevs2011】最小距离之和 [LNOI2013](Floyd)

    题目网址:http://codevs.cn/problem/2011/ 题目大意:有一个图,每次删一条边(可以重复删),求每次删边之后所有点对的最短距离之和. 看了一眼题目,顿时发现了O(n^4)的暴 ...

  8. super和this 在构造方法上的用法

    super Super()表示调用父类的构造方法.如果没有定义构造方法,那么就会调用父类的无参构造方法,即super(). this 在构造方法中,this表示本类的其他构造方法:student(st ...

  9. ubuntu12.04 错误:phonon: No such file or directory; phonon模块的安装

    http://blog.csdn.net/xsl1990/article/details/9009919 错误:phonon: No such file or directory 1)sudo  ap ...

  10. tyvj 1057 金明的预算方案 背包dp

    P1057 金明的预算方案 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 NOIP2006 提高组 第二道 描述 金明今天很开心,家里购置的新房就要领钥匙了 ...