将webapi 添加到mvc中 -ASP.NET Web API 框架系列文(1)

  • Post author:
  • Post category:其他


           vs 2013 有自带的web API 项目,(如图1-1)而vs 2012 的需要新建一个mvc 应用程序,然后使用nugut, 控制台模式 输入安装命令:

Install-Package Microsoft.AspNet.WebApi,会自动把webapi 需要的dll包安装到你的项目。

图:1-1

当你运行混合有mvc 和web api 的项目时,asp.net 会使用 HttpApplication.MapRequestHandler(在选择了用来响应请求的处理程序),来决定哪一种http 处理程序去处理请求,当路由匹配的时候,会产生一个IRouteHandler ,IRouteHandler的目的是创建一个IHttpHandler 去处理请求, 如果的 IRouteHandler 是一个 HttpControllerRouteHandler , 那么就会走webapi 路线,如果是MvcRouteHandler 那么就走mvc

在底层,web api  是建立在 IHttpAsyncHandler 的异步处理程序上的,它的作用是拦截和处理向服务器发出的请求和响应客户端。

public interface IHttpAsyncHandler : object, IHttpHandler
{
      System.IAsyncResult BeginProcessRequest(HttpContext context, System.AsyncCallback cb,  
object extraData);
    void EndProcessRequest(System.IAsyncResult result);
}

事实上,mvc 和webAPI 没有太大的区别在框架上,他们的上层都是一个http 处理程序,主要不同的地方在于 MvcRouteHandler 实现IHttpAsyncHandler,而HttpControllerHandler 实现HttpTaskAsyncHandler

public class HttpControllerHandler : HttpTaskAsyncHandler
{
    public HttpControllerHandler(RouteData routeData);
    public HttpControllerHandler(RouteData routeData, HttpMessageHandler handler);
 
    public override Task ProcessRequestAsync(HttpContext context);
}

 public class Book
    {
        public int Id { get; set; }
        public string Author { get; set; }
        public string Title { get; set; }
    }

  public static class Books
    {
        public static List<Book> List = new List<Book>
        {
            new Book {Id = 1, Author = "ivan1", Title = "课程"},
            new Book {Id = 2, Author = "ivan5", Title = "课程1"},
            new Book {Id = 3, Author = "ivan3", Title = "课程2"},
            new Book {Id = 4, Author = "ivan2", Title = "课程3"}
        };
    }

 public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            
            //注册特性路由
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }

 public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }

public class BooksController : ApiController         // web api 是继承 ApiController

{


public Book GetById(int id)

{


var book = Books.List.FirstOrDefault(x => x.Id == id);

if (book == null) throw new HttpResponseException(HttpStatusCode.NotFound);

return book;

}

}

public class BooksController : Controller

{


public ActionResult Details(int id)

{


var book = Books.List.FirstOrDefault(x => x.Id == id);

if(book == null) return new HttpNotFoundResult();

return View(book);

}

public ActionResult Index()

{


return View(Books.List);

}

}

public class MvcApplication : System.Web.HttpApplication

{


protected void Application_Start()

{

GlobalConfiguration.Configure(WebApiConfig.Register);// 注册webapi路由

RouteConfig.RegisterRoutes(RouteTable.Routes);/ 注册mvc 路由

}

}

我们输入/api/books/{id}  会路由到webAPI

而/books/details/{id} 则是路由到 mvc



版权声明:本文为xiazetong原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。