zoukankan      html  css  js  c++  java
  • 简话ASP.NET Web API

    简话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关键的两个命名空间。关于它们的重要性,这在以后再讲)的引用和生成如下默认方法:

     View Code

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

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

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

     View Code

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

     View Code

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

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

     View Code

    使用HttpClient 调用WebApi

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

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

     View Code

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

    Read:

    Create:

    Update:

    Delete:

    在回头看看我们的ProductController:

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

     View Code

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

    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)方法我们还必须添加新的路由规则如下:

     View Code

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

    示例代码

     

     

                                                                                                                                                                      

     
     
    分类: ASP.NET
  • 相关阅读:
    Leetcode Plus One
    Leetcode Swap Nodes in Pairs
    Leetcode Remove Nth Node From End of List
    leetcode Remove Duplicates from Sorted Array
    leetcode Remove Element
    leetcode Container With Most Water
    leetcode String to Integer (atoi)
    leetcode Palindrome Number
    leetcode Roman to Integer
    leetcode ZigZag Conversion
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3840837.html
Copyright © 2011-2022 走看看