我一直在使用MVC4中的RouteConfig类进行一些处理,我遇到了一个奇怪的行为,我不知道它为什么会发生。
我在课程中有以下代码:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.Add("Favicon", new Route("favicon.ico", new FavIconFileHandler()));
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
这个想法是,当有人访问http://my.domain.com/favicon.ico时,将根据所使用的子域提供不同的文件。例如,http://app1.domain.com会得到http://app2.domain.com的另一个。{3}}。我知道这可以通过IISRewrite完成,但我正在尝试探索这条路线来解决问题。
这里的代码实际上有效,问题是现在当我在MVC中提交任何表单时,我得到以下网址:
http://localhost:13424/favicon.ico?action=ShowResult&controller=Home
而不是
http://localhost:13424/Home/ShowResult
为什么会发生这种情况以及为什么要将favicon.ico附加到网址?
答案 0 :(得分:1)
您可以使用已启用的RouteDebugging调试此行为。
使用以下命令修改web.config:
<add key="RouteDebugger:Enabled" value="true" />
块中的 <appSettings>
确保您的默认路由处理程序位于路由表的底部中。
答案 1 :(得分:1)
最好在web.config处理程序部分添加处理程序,然后在路由映射中忽略它。但是如果你想要使用你的解决方案,你需要创建一个自定义路由类,这里的ovveride GetVirtualPath方法是用于注册路由的示例代码:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.Add("Favicon", new CustomRoute("favicon.ico", new FavIconFileHandler()));
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
CustomRoute Class:
public class CustomRoute : Route
{
public CustomRoute(string uri, IRouteHandler handler) : base(uri, handler)
{
}
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
return null;
}
}
这是有效的,因为ASP.NET MVC会在生成操作链接时为每个注册的路由调用VirtualPathData,如果路由返回null,则不会考虑此路由生成URL。
以下是来自MVC的代码,用于检查VirtualPathData的结果:
public VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
requestContext = this.GetRequestContext(requestContext);
using (this.GetReadLock())
{
foreach (RouteBase current in this)
{
VirtualPathData virtualPath = current.GetVirtualPath(requestContext, values);
if (virtualPath != null)
{
virtualPath.VirtualPath = RouteCollection.GetUrlWithApplicationPath(requestContext, virtualPath.VirtualPath);
return virtualPath;
}
}
}
return null;
}