【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就可以了

 

转载于:https://www.cnblogs.com/Sunlimi/p/webapi-start.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259153.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三星s8怎么分屏操作_三星手机该怎么玩?了解完这几点用机技巧,可以轻车熟路了!...

其实对于三星这个手机品牌&#xff0c;我还是很佩服的。虽然近些年来&#xff0c;三星在国内的市场份额日渐变少&#xff0c;但是在国内的影响力依然尚存。毕竟三星手机在某些方面还是很有优势的&#xff0c;特别是旗舰系列机型深受消费者喜爱。接下来&#xff0c;笔者就跟大家…

二维数组的指针复习

最近一次的考试都是指针&#xff0c;真是给我深深上了一课&#xff0c;所以我特此复习一下指针方面的知识。二维数组的指针 int a[3][4] {{1,3,5,7},{9,11,13,15},{17,19,21,23}}; 下面通过一个表来做详细的说明&#xff1a; 访问二维数组&#xff0c;有两种方法&#xff0c;一…

称重的问题

给你8颗小石头和一架托盘天平。有7颗石头的重量是一样的&#xff0c;另外一颗比其他石头略重&#xff1b;除此之外&#xff0c;这些石头完全没有分别。你不得假设那颗重头到底比其他的石头重了多少。请问&#xff1a;最少要称量几次&#xff0c;你才能把那颗较重的石头找出来&a…

TIF图像文件的读取(c++代码)

一 TIF图像介绍 TIFF是最复杂的一种位图文件格式。TIFF是基于标记的文件格式&#xff0c;它广泛地应用于对图像质量要求较高的图像的存储与转换。由于它的结构灵活和包容性大&#xff0c;它已成为图像文件格式的一种标准&#xff0c;绝大多数图像系统都支持这种格式。 TIFF 是一…

g menu i meun_长沙话读“这里”,到底是阁(gó)里还是该(gái)里

“带笼子”、“打抱秋”……这些地道的长沙话&#xff0c;长沙人&#xff0c;你有多久没听过了&#xff1f;/ 长沙人&#xff0c;你还记得长沙话吗 / “去了很多地方&#xff0c;最后还是回到了长沙”“我听见了一句长沙话&#xff0c;就想回长沙了。”逗霸妹听过很多人回长沙的…

git使用---工作区和暂存区

转载于:https://www.cnblogs.com/momo-unique/articles/4380551.html

偶数哥德巴赫猜想

已知不小于6的偶数都可以分成两个素数之和。请编写6到100000的所有偶数的分解&#xff0c;若有一个偶数可以分解成多个素数之和&#xff0c;只需写出一种即可。 #include <iostream> #include <algorithm> using namespace std;bool isprime(int n)//判断素数{int …

电脑常见故障处理_彩超常见故障及维修

彩超是医学检测手段中重要的环节之一&#xff0c;是对产妇以及对病人进行内部组织和结构观察的重要方式之一&#xff0c;彩超应用得当可以及早的诊断出病人的疾病&#xff0c;为患者解除疾病的困扰。彩超设备是一种极为先进的诊断系统&#xff0c;一般彩超系统包括以下几个部分…

用基本信号画出如下的信号_股市入门基本知识丨下跌时期可以抄底的安全信号有哪些...

点击蓝色字体 关注我们 带来更多精彩股票市场中的秘籍其实就是“低买高卖”&#xff0c;不过我们不能在大盘一开始下跌的时候就进行买入&#xff0c;因为不清楚下跌的时间&#xff0c;太早介入&#xff0c;只有在反弹幅度超出我们介入的点的时候才可以进行高卖。那么什么时候才…

Flume数据传输事务分析[转]

本文基于ThriftSource,MemoryChannel,HdfsSink三个组件&#xff0c;对Flume数据传输的事务进行分析&#xff0c;如果使用的是其他组件&#xff0c;Flume事务具体的处理方式将会不同。一般情况下&#xff0c;用MemoryChannel就好了&#xff0c;我们公司用的就是这个&#xff0c;…

yii2中的rules验证规则

2019独角兽企业重金招聘Python工程师标准>>> Rules验证规则&#xff1a;required : 必须值验证属性||CRequiredValidator 的别名, 确保了特性不为空.[[字段名],required,requiredValue>必填值,message>提示信息];email : 邮箱验证||CEmailValidator 的别名,确…

opengl 如何加阴影_动漫嘴唇厚涂如何绘制?厚涂嘴唇正确画法

动漫嘴唇厚涂如何绘制&#xff1f;厚涂嘴唇正确画法&#xff01;嘴巴怎么画&#xff1f;画嘴巴真的很考验一个画师功力&#xff0c;好看的嘴巴生动而丰满&#xff0c;可以给整幅画作添上亮点&#xff0c;而画的不好的嘴巴呢&#xff0c;就容易把画面整体的风格打破。那么零基础…

详解JMeter函数和变量

详解JMeter函数和变量&#xff08;1&#xff09; JMeter函数可以被认为是某种特殊的变量&#xff0c;它们可以被采样器或者其他测试元件所引用。函数调用的语法如下&#xff1a; ${__functionName(var1,var2,var3)} 其中&#xff0c;__functionName匹配被调用的函数名称。用圆括…

hdu 5199 map或二分或哈希

题目描述&#xff1a;给出n棵树的高度&#xff0c;每棵树上都站着一只鸟&#xff0c;枪手Jack站在最左边那棵树的左边对鸟进行射击&#xff0c;当Jack在高度为H的地方向右发射一颗子弹的时候&#xff0c;高度为H的树上的鸟儿就会掉落&#xff08;注&#xff1a;其他树上的鸟儿不…

数字电路实验怎么接线视频讲解_家庭影院中音箱、功放、投影机、4K播放机不知道怎么连接?手把手教你...

家庭影院中音箱、功放、投影机、4K播放机不知道怎么连接&#xff1f;手把手教你有不少用户收到从家庭影院器材之后&#xff0c;表示完全不会连接。翻看说明书也觉得头大&#xff0c;知识太多&#xff0c;然而却很难找到要点。今天主要跟大家讲讲如何连接音箱、功放、投影机和影…

.NET开发过程中的全文索引使用技巧之Solr

前言&#xff1a;相信许多人都听说过.net开发过程中基于Lucene.net实现的全文索引&#xff0c;而Solr是一个高性能&#xff0c;基于Lucene的全文搜索服务器。同时对其进行了扩展&#xff0c;提供了比Lucene更为丰富的查询语言&#xff0c;同时实现了可配置、可扩展并对查询性能…

auto.js停止所有线程_Java线程与并发编程实践:深入理解volatile和final变量

同步有两种属性&#xff1a;互斥性和可见性。synchronized关键字与两者都有关系。Java同时也提供了一种更弱的、仅仅包含可见性的同步形式&#xff0c;并且只以volatile关键字关联。假设你自己设计了一个停止线程的机制(因为无法使用Thread不安全的stop()方法))。清单1中Thread…

项目实例改编:利用structs2的action 实时显示图片、pdf和其他内容的框架抽取。(转)...

转自&#xff1a;http://www.verydemo.com/demo_c167_i1382.html 针对&#xff1a;预览文件&#xff08;图片&#xff0c;PDF&#xff09;文件来源为action中的inputStream 重点&#xff1a; structs2的action的配置 action的写法和结果类型 resulttype的写法 网页上实…

开始Go开发之旅-Golang架构师之路系列实战

2019独角兽企业重金招聘Python工程师标准>>> 作者: gomaster.me(冯琪超) 系列:Golang架构师之路 巧妇难做无米之炊&#xff0c;golang sdk就是gopher的大米 下载golang 点击 官网下载golang sdk 根据不同系统&#xff0c;官网下载链接会选择相应的平台进行链接跳转&…

安卓9.0官方系统升级包_华为、荣耀公布可升级安卓10.0机型,你的手机在名单之内吗?...

在近两个月以前&#xff0c;美方将华为关进了小黑屋&#xff0c;随后谷歌也将华为旗下的机型移出了安卓10.0升级名单&#xff0c;这一波操作之后&#xff0c;引起了不小的“恐慌”&#xff0c;许多华为用户也在担心是否还能正常使用安卓系统服务&#xff0c;不过&#xff0c;让…