如何解决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就解决问题了

359923-20170401140524680-15997652.jpg

3、问题解决

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

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

359923-20170401000836149-1169476299.png

好了问题解决~~~

代码示例下载

转载于:https://www.cnblogs.com/lollipop/p/6651124.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值