大佬们,请教一个问题,在做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
不行的,我试过,我也试过很多种配置路由的方式
而且,我写的HttpControllerDispatcher这个也没进,不知道咋回事
@众生少两千: IHttpControllerSelector IHttpActionSelector 试试它们
@czd890: 好的。我试试,谢了哈
@众生少两千:
IApplicationBuilder.UseStatusCodePagesWithReExecute,UseStatusCodePages 也可以考虑
参考:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/error-handling?view=aspnetcore-2.2
@czd890: 谢谢大佬,基本上可以了
@czd890: 我刚刚又测试一下,其实配置多加一个路由就行了,这样
config.Routes.MapHttpRoute(
name: "RootApi",
routeTemplate: "{*url}",
defaults: new { controller = "Default", action = "GetAll", url= RouteParameter.Optional }
);
但是之前不行,是因为 参数名称的原因,public string GetAll(string url),routeTemplate 中的参数名称一定要是跟action的参数一样。
是 asp.net core 吗?
– dudu 5年前@dudu: 不好意思,忘了谢了,是.net framework的
– 众生少两千 5年前@dudu: .net framework4.5.2
– 众生少两千 5年前