简话ASP.NET Web API

在vs2012中,我们很容易在根据选择的ASP.NET MVC Web应用程序来新建一个Web API应用,聪明的你一定想见得到,Web API和MVC有着某种联系。但是今天的主题不是这个,而是它——ASP.NET Web API的简单创建和调用。但是在开始之前,首先还是来看看它和MVC到底有什么联系。

ASP.NET MVC vs ASP.NET Web API        

WebApi建立在MVC框架所使用的同样设计模式之上(因此本文实例依旧采用既有的ASP.NET MVC Web应用程序来说明问题)。至于微软为什么选择了MVC而非WebForm作为它的设计模式基础,自然是看中了MVC框架的诸多优势,当然,本文不讨论MVC和WebForm孰优孰劣,有兴趣的可以看下去看下这篇文章。但是Web API是作为一个独立的ASP.NET特性而实现的,并且可以将它用于MVC框架之外,这意味着,微软在 System.Web.Http 命名空间中复制了某些关键的MVC框架功能,以保持MVC与Web API特性相互独立.因此通过模板建立的asp.net mvc 应用程序有两套路由:分别用于MVC框架控制器和Web API控制器。System.Web.Http 命名空间中复制了某些关键的MVC框架功能,以保持MVC与Web API特性相互独立。

WebApi走起

先新建一个ASP.NET 空 Web 应用程序(顺便用它来承载WebApi),命名为WebApi。而且采用和MVC模版默认生成的模版一样的文件架构。添加一个App_Start、Controllers、Models、Views文件夹和一个全局应用程序类(Global.asax)基本框架准备好了,其实通过ASP.NET MVC 4 Web应用程序模版。它也默认为你准备好了这些。但是为了让自己对它有一个感官的认识(实际开发过程中完全不必要这么干)。最终的项目文件架构图如下:

好了,接下来,在Controllers文件夹上右键添加新建项——一个Web API控制器类命名为ProductController(当然我们也可以自己创建一个class然后通过手动添加System.Web.Http的引用来实现ApiController类,它将为我们添加 System.Net.Http、System.Web.Http(这2个命名空间是WebApi关键的两个命名空间。关于它们的重要性,这在以后再讲)的引用和生成如下默认方法:

 

Controller准备好了,接下来在App_Start文件夹下添加一个类命名为WebApiConfig(它是相对于MVC里的RouteConfig而言的,是专门为我们管理路由的)。

1.为了方便调用,修改默认命名空间为WebApi(即解决方案的默认命名空间)

2.添加System.Web.Http引用,添加一个静态方法Register。如下所示:

接下来在Global.asax.cs的Application_Start事件中注册路由。如下所示:

接下来添加我事先准备好的数据层(省去业务逻辑层)和模型层的DLL引用

实现ProductController的四个方法,如下所示:

使用HttpClient 调用WebApi

好了,为了测试我们新建的WebApi,新建一个测试网站(采用ASP.NET Web MVC应用程序)。

新建一个ProductController控制器,代码如下所示:

新建3个视图,Index.cshtml、Edi.cshtmlt、Add.cshtml。下面是测试结果(注:测试为了方便,WebApi是通过IIS进程寄宿)。

Read:

Create:

Update:

Delete:

在回头看看我们的ProductController:

所有的方法命名都是使用默认生成的,这种情况下WebApi的默认路由会为我们自动映射来实现路由的寻址。但是实际生产中,我们肯定会使用更实际的命名。那么上面的效果是否依然能够实现呢?答案是肯定的。为了测试方便,我直接添加了一个新的TestProductController,代码如下:

接着上面的问题而来,如果在实际业务中还需要这么一个方法:

public List<Mvc.Model.Product> GetProducts(string category)
{
return iproduct.GetProducts(category);
}

即根据category来查找全部的Product,我们要加一个上面的这个方法。它是下面方法的重载:

public List<Mvc.Model.Product> GetProducts()
{
return iproduct.GetProducts();
}

那么在默认的路由配置下我们能不能请求得到呢?呵呵,如果熟悉MVC路由配置的你,肯定知道这是不行的。不信有图有真相:

它最终试图尝试与GetProduct(int id)方法Route,但是参数"手机"没有被字典收录,以至通讯失败。那为了能够访问到GetProducts(string category)方法我们还必须添加新的路由规则如下:

这暂时也能解决问题,但是如果这样的业务逻辑很多,是不是要在WebApiConfig的Register方法中注册一堆的路由规则呢?有没有其它的办法?呵呵,时间很晚了,关于这个问题,下次接着聊。

示例代码

                                                                                                                                                                  

 
 
分类: ASP.NET

简话ASP.NET Web API的更多相关文章

  1. ASP.NET Web API Model-ModelMetadata

    ASP.NET Web API Model-ModelMetadata 前言 前面的几个篇幅主要围绕控制器的执行过程,奈何执行过程中包含的知识点太庞大了,只能一部分一部分的去讲解,在上两篇中我们看到在 ...

  2. ASP.NET Web API WebHost宿主环境中管道、路由

    ASP.NET Web API WebHost宿主环境中管道.路由 前言 上篇中说到ASP.NET Web API框架在SelfHost环境中管道.路由的一个形态,本篇就来说明一下在WebHost环境 ...

  3. ASP.NET Web API 开篇示例介绍

    ASP.NET Web API 开篇示例介绍 ASP.NET Web API 对于我这个初学者来说ASP.NET Web API这个框架很陌生又熟悉着. 陌生的是ASP.NET Web API是一个全 ...

  4. 新作《ASP.NET Web API 2框架揭秘》正式出版

    我觉得大部分人都是“眼球动物“,他们关注的往往都是目光所及的东西.对于很多软件从业者来说,他们对看得见(具有UI界面)的应用抱有极大的热忱,但是对背后支撑整个应用的服务却显得较为冷漠.如果我们将整个“ ...

  5. ASP.NET Web API 2框架揭秘

    ASP.NET Web API 2框架揭秘(.NET领域再现力作顶级专家精讲微软全新轻量级通信平台) 蒋金楠 著   ISBN 978-7-121-23536-8 2014年7月出版 定价:108.0 ...

  6. Asp.Net Web API 2第八课——Web API 2中的属性路由

    前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 路由就是Web API如何 ...

  7. 【转】ASP.NET WEB API系列教程

    from: 西瓜小强 http://www.cnblogs.com/risk/category/406988.html ASP.NET Web API教程(六) 安全与身份认证 摘要: 在实际的项目应 ...

  8. 支持Ajax跨域访问ASP.NET Web Api 2(Cors)的简单示例教程演示

    随着深入使用ASP.NET Web Api,我们可能会在项目中考虑将前端的业务分得更细.比如前端项目使用Angularjs的框架来做UI,而数据则由另一个Web Api 的网站项目来支撑.注意,这里是 ...

  9. ASP.NET Web API安全认证

    http://www.cnblogs.com/codeon/p/6123863.html http://open.taobao.com/docs/doc.htm?spm=a219a.7629140.0 ...

随机推荐

  1. [Tool]利用Advanced Installer建立x86/x64在一起的安装程式

    原文 [Tool]利用Advanced Installer建立x86/x64在一起的安装程式 之前使用InstallShield做安装程式时,如果要将程式放在Program Files的话,需要分别针 ...

  2. verilog中的有符号数运算

    verilog中的有符号数运算 http://hi.baidu.com/lixu1113/item/d00dc095f86aed48f142159a verilog中的有符号数运算 有符号数的计算:若 ...

  3. Scala课程01

    Scala课程01 简介 由于本人刚毕业,也是从事软件开发相关的工作.想再学习一下关于大数据.移动互联网.云计算相关的技术.为我的未来打好基础.并且从零开始学习大数据相关的知识,脚踏实地的走好每一步, ...

  4. (两)unity4.6Ugui中国教程文档-------总结-UGUI Canvas

    大家好,我是广东太阳.   转载请注明出处:http://write.blog.csdn.net/postedit/38922399 更全的内容请看我的游戏蛮牛地址:http://www.unitym ...

  5. 我的MYSQL学习心得(五)

    原文:我的MYSQL学习心得(五) 我的MYSQL学习心得(五) 我的MYSQL学习心得(一) 我的MYSQL学习心得(二) 我的MYSQL学习心得(三) 我的MYSQL学习心得(四) 我的MYSQL ...

  6. oracle 数据库备份

    //创建临时表空间create temporary tablespace test_temp tempfile 'D:\oracle\data\test\test_temp.dbf' size 32m ...

  7. JS中call、apply的用法说明

    JS Call()与Apply()的区别 ECMAScript规范给所有函数都定义了Call()与apply()两个方法,call与apply的第一个参数都是需要调用的函数对象,在函数体内这个参数就是 ...

  8. Android环境结构--安装Eclipse错

    在学习安卓第一步.成立了一个开发环境. 经验,知道,所以这一步是不容易,因为你觉得,我可能是太幸运了. 我见到 题. 首先,安装Eclipse的时候. [Problem 1] [问题原因]: (1) ...

  9. ASP.NET——RequiredFieldValidator控制和ValidationSummary控制

    我们的登录页面,忘记承担损失password然后username,该页面将永远是一个小提醒. 那么我们在网也制作的时候怎样实现这一功能呢?这就用到了RequiredFieldValidator控件和V ...

  10. ENode 2.0

    ENode 2.0 - 介绍一下关于ENode中对Command的调度设计 摘要: CQRS架构,C端的职责是处理从上层发送过来的command.对于单台机器来说,我们如何尽快的处理command呢? ...