首页 新闻 会员 周边 捐助

WebApi 找到了多个与 URL 匹配的控制器类型

0
悬赏园豆:5 [已解决问题] 解决于 2019-05-28 10:46

大佬们,请教一个问题,在做webApi的时候,有个需求,就是所有的Get请求,如果webapi服务器没有找到这个匹配的地址,就将请求导向一个固定的地址,我在做的时候,用[Route("{*route}",Order = 9999)]这种方式来实现的,但是有个问题,如果这个Action在同一个控制器中能够根据Order排序来实现,但是如果有多个控制器,就会报错

{
"Message": "出现错误。",
"ExceptionMessage": "找到了多个与 URL 匹配的控制器类型。如果多个控制器上的特性路由与请求的 URL 匹配,则可能会发生这种情况。\r\n\r\n请求已找到下列匹配的控制器类型: \r\nWebApplication1.Controllers.DemoController\r\nWebApplication1.Controllers.DefaultController",
"ExceptionType": "System.InvalidOperationException",
"StackTrace": " 在 System.Web.Http.Dispatcher.DefaultHttpControllerSelector.GetDirectRouteController(IHttpRouteData routeData)\r\n 在 System.Web.Http.Dispatcher.DefaultHttpControllerSelector.SelectController(HttpRequestMessage request)\r\n 在 System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__15.MoveNext()"
}

或者是有没有其他方法可以实现这个需求呢?我看报错的信息有个HttpControllerDispatcher,能根据这个来实现么?还请指导,谢谢

问题补充:

request.GetRouteData(); 是能够得到两个,但是正确访问的时候,也是两个,
环境是.net framework4.5.2

众生少两千的主页 众生少两千 | 初学一级 | 园豆:1
提问于:2019-05-28 09:37

是 asp.net core 吗?

dudu 5年前

@dudu: 不好意思,忘了谢了,是.net framework的

众生少两千 5年前

@dudu: .net framework4.5.2

众生少两千 5年前
< >
分享
最佳答案
1
收获园豆:5
czd890 | 专家六级 |园豆:14488 | 2019-05-28 10:12

不行的,我试过,我也试过很多种配置路由的方式

众生少两千 | 园豆:1 (初学一级) | 2019-05-28 10:21

而且,我写的HttpControllerDispatcher这个也没进,不知道咋回事

众生少两千 | 园豆:1 (初学一级) | 2019-05-28 10:23

@众生少两千: IHttpControllerSelector IHttpActionSelector 试试它们

czd890 | 园豆:14488 (专家六级) | 2019-05-28 10:28

@czd890: 好的。我试试,谢了哈

众生少两千 | 园豆:1 (初学一级) | 2019-05-28 10:28

@众生少两千:
IApplicationBuilder.UseStatusCodePagesWithReExecute,UseStatusCodePages 也可以考虑

参考:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/error-handling?view=aspnetcore-2.2

czd890 | 园豆:14488 (专家六级) | 2019-05-28 10:32

@czd890: 谢谢大佬,基本上可以了

众生少两千 | 园豆:1 (初学一级) | 2019-05-28 10:55

@czd890: 我刚刚又测试一下,其实配置多加一个路由就行了,这样
config.Routes.MapHttpRoute(
name: "RootApi",
routeTemplate: "{*url}",
defaults: new { controller = "Default", action = "GetAll", url= RouteParameter.Optional }
);
但是之前不行,是因为 参数名称的原因,public string GetAll(string url),routeTemplate 中的参数名称一定要是跟action的参数一样。

众生少两千 | 园豆:1 (初学一级) | 2019-05-28 11:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册