zoukankan      html  css  js  c++  java
  • 如何解决Asp.Net MVC和WebAPI的Controller名称不能相同的问题

    1、问题描述

    假如有一个文章的业务(Article),我们在 Controllers文件夹中创建MVC Controller和Api Controller,各个Controller中都有相同的获取文章内容的Action(Content)。路由为默认设置
    MVC的路由为
    {controller}/{action}/{id}
    
    Api的路由为
    api/{controller}/{action}/{id}
    
    然而我希望访问的
    • MVC的URL为 ~/Article/Content/1
    • API的URL为 ~/api/Article/Content/1

    那么就是MVC和API的控制器都应该命名为ArticleController,其中MVC控制器继承与Controller,API控制器继承ApiController。但是两个控制器肯定不能重名啊。
    那我们先把API的名字改为ArticleApiController,So 访问路径为api/ArticleApi/Content/1 可是这样不是个事儿啊~~

    So......We need change the controller name!

    2、问题原因

    通过查看微软System.Web.Http的源码,我们发现其实这个问题也很好解决,在这个DefaultHttpControllerSelector类中,微软有定义Controller的后缀,如图
    我们只要把ApiController的后缀改成和MVC不一样,就可以解决问题了。
    这个字段是个静态只读的Field,我们只要把它改成ApiContrller就解决问题了

    3、问题解决

    可以利用反射解决这个问题,在注册API路由前添加以下代码即可解决

     var suffix = typeof(DefaultHttpControllerSelector).GetField("ControllerSuffix", BindingFlags.Static | BindingFlags.Public);
    if (suffix != null) suffix.SetValue(null, "ApiController");
    

    好了问题解决~~~

    代码示例下载
  • 相关阅读:
    纪中集训 Day 2
    纪中集训 Day1
    纪中集训 Day 0?
    BZOJ 1033: [ZJOI2008]杀蚂蚁antbuster(模拟)
    BZOJ 3527: [Zjoi2014]力(FFT)
    wikioi 3132 高精度乘法(FFT)
    BZOJ 1085: [SCOI2005]骑士精神(A*算法)
    BZOJ 1009 :[HNOI2008]GT考试(KPM算法+dp+矩阵快速幂)
    BZOJ 1019 :[SHOI2008]汉诺塔(递推)
    BZOJ 1021 :[SHOI2008]Debt 循环的债务 (DP)
  • 原文地址:https://www.cnblogs.com/lollipop/p/6651124.html
Copyright © 2011-2022 走看看