描述我在Visual Studio 2012升级的现有MVC4/WebAPI1项目MVC5/WebAPI2 这里.该网站按预期工作.然后我按照这里找到的基于属性的路由的指示- 除了我不断获得控制器的404.我的步骤是:
我看到在config.EnsureInitialized()之后我暂停了测试路由.然而,尝试击中那条路线给了我一个404.
如果有任何方法可以检查请求并查看路由表是如何匹配的?
是否可以仅为使用路由属性的特定控制器添加MessageHandler?
如果它不包含某些标头,我想在管道中提前删除请求.我想提一下:
我无法在WebApiConfig中添加其他路由,我们必须使用控制器中的路由属性.
我不想全局添加MessageHandler.
它必须是MessageHandler(在管道的早期).我们有替代方案,但我们正在努力提高效率.
例如,我用以下RoutePrefix修饰了控制器:api/myapicontroller和一个带有Route("")的动作.(我知道这很奇怪,我们正在根据查询字符串选择不同的动作)
然后,我补充说
config.Routes.MapHttpRoute(
name: "CustomRoute",
routeTemplate: "api/myapicontroller/{id}",
defaults: new { id = RouteParameter.Optional },
constraints: null,
handler: new myMessageHandler()
);
Run Code Online (Sandbox Code Playgroud)
如果我在config.MapHttpAttributeRoutes();执行myMessageHandler 之前放置此代码,但是我收到此消息:
控制器'myapicontroller'上没有找到与请求匹配的操作
如果我config.MapHttpAttributeRoutes();先放,myMessageHandler永远不会被执行,但调用myapicontroller中的my动作.
asp.net asp.net-web-api routeattribute asp.net-web-api2 message-handlers
我收到以下路由属性的异常:
[Route("{id}?action=decline")]
Run Code Online (Sandbox Code Playgroud)
例外:
System.Web.Http.dll 中出现“System.ArgumentException”类型的异常,但未在用户代码中处理
附加信息:路由模板不能以“/”或“~”字符开头,也不能包含“?” 特点。
为什么这是不允许的?
我正在建立一个多租户网站,我在我的应用程序中使用MapMvcAttributeRoutes和标准MapRoute.当我在不使用RouteAttribute的控制器中时,我也使用此代码成功获取子域名.我无法从使用RouteAttribute的任何控制器/操作中获取子域值.RouteData集合中不存在该值.那么当我在使用RouteAttribute的Action中时如何获取子域值?
这里是RegisterRoutes的代码:
public static void RegisterRoutes(RouteCollection routes)
{
const string mainNamespace = "Presentation.Website.Controllers";
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes(); // Activate attribute Routing
// This will add the parameter "subdomain" to the route parameters
// TODO: Do the same for MapMvcAttribute! but how... ?
routes.Add(new SubdomainConfig(new[] { "www", "yourdomain", "mail" }, new[] { mainNamespace }, CoreSettings.SubDomainKey));
routes.MapRoute(name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new[] { mainNamespace });
}
Run Code Online (Sandbox Code Playgroud)
例如
这将有效:
[AllowAnonymous] …Run Code Online (Sandbox Code Playgroud) 该RouteAttribute("abc", Order = 2)排序仅似乎在控制器内推崇:当在同一个控制器定义以下方法,我得到预期的行为,即Method1优先级,Method2则永远不会调用。
[Route("abc", Order = 1)]
public ActionResult Method1() { ... }
[Route("abc", Order = 2)]
public ActionResult Method2() { ... }
Run Code Online (Sandbox Code Playgroud)
如果我在两个单独的控制器中定义这些方法,我会得到一个不明确的路由异常: InvalidOperationException: Multiple controller types were found that match the URL. This can happen if attribute routes on multiple controllers match the requested URL.
是否可以使用属性路由定义跨控制器的顺序?
编辑 1:当分布在多个控制器上时,似乎即使在一个控制器内具有隐式排序的路由也是模棱两可的。以下在一个控制器中是可以的(通配符之前的文字),但如果放入不同的控制器中会引发异常。
[Route("details/abc")]
[Route("details/{product}")]
Run Code Online (Sandbox Code Playgroud)
这让我认为它是设计使控制器保持专注并强制在同一控制器中定义类似的路由。
编辑2:
这些是我真正想要使用的路线。我想把它们放到不同的控制器中,因为它们做不同的事情。它们的区别在于前缀。
[Route("reactive/monitor")]
[Route("{tier}/monitor")]
Run Code Online (Sandbox Code Playgroud) c# asp.net-mvc asp.net-mvc-routing routeattribute asp.net-mvc-5