简话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. C#动态调用WCF接口

    C#动态调用WCF接口 写在前面 接触WCF还是它在最初诞生之处,一个分布式应用的巨作. 从开始接触到现在断断续续,真正使用的项目少之又少,更谈不上深入WCF内部实现机制和原理去研究,最近自己做一个项 ...

  2. ECLIPSE IDEA 调音 1

    为自己所用IDE进行jvm优 首先进行日志输出配置 Eclipse  改动eclipse.ini IDEA   改动 idea.exe.vmoptions 添加打印日志的配置參数 -XX:+Print ...

  3. react.js 从零开始(六)Reconciliation

    Reconciliation   React 的关键设计目标是使 API 看起来就像每一次有数据更新的时候,整个应用重新渲染了一样.这就极大地简化了应用的编写,但是同时使 React 易于驾驭,也是一 ...

  4. flume日志采集

    1.  Log4j Appender 1.1.  使用说明 1.1.2.  Client端Log4j配置文件 (黄色文字为需要配置的内容) log4j.rootLogger=INFO,A1,R # C ...

  5. 第23章 访问者模式(Visitor Pattern)

    原文 第23章 访问者模式(Visitor Pattern) 访问者模式 导读:访问者模式是我个人认为所有行为模式中最为复杂的一种模式了,这个模式可能看一遍会看不懂,我也翻了好几个例子,依然不能很好的 ...

  6. HDU 1598 find the most comfortable road (最小生成树) &gt;&gt;

    Problem Description XX明星有许多城市,通过与一个陌生的城市高速公路SARS(Super Air Roam Structure---超级空中漫游结构)进行交流.每条SARS都对行驶 ...

  7. hdu 1098 Ignatius's puzz

    有关数论方面的题要仔细阅读,分析公式. Problem Description Ignatius is poor at math,he falls across a puzzle problem,so ...

  8. oracle_constraint的用处

    ql中constraint主要是增加约束 这个主要就是增加约束的 以下几种约束 .并 一一列举: 1.主键约束: 主键约束:就是对一个列进行了约束,约束为(非空.不重复)要对一个列加主键约束的话,这列 ...

  9. keil程序在外部RAM中调试的问题总结(个人的一点经验总结)

    keil程序在内部RAM调试的基本步骤网上已经有非常多了,我就不再赘述,大家能够在网上搜到非常多. 可是有些时候内部RAM并不够用,这就须要将程序装入外部RAM中调试,而在这个过程中可能会出现各种各样 ...

  10. IOS SDK相机的详细解释/画廊(默认+他们的高清摄像头接口)

    原版的blog,转载请注明出处 blog.csdn.net/hello_hwc 前言: 新NSURLSession的UploadTask的,结果写那个Demo的时候想要写成拍照上传.然后就想到先写一个 ...