1

私は 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とは別のものを取得します。これは IISRewrite で実行できることはわかっていますが、このルートを調べて問題も解決しようとしています。

ここのコードは実際に機能します。問題は、MVC でフォームを送信すると、次の URL が表示されることです。

http://localhost:13424/favicon.ico?action=ShowResult&controller=Home

それ以外の

http://localhost:13424/Home/ShowResult

なぜこれが起こっているのか、なぜ favicon.ico が URL に追加されているのか?

4

2 に答える 2

1

RouteDebugging を有効にすると、この動作をデバッグできます。

次のように web.config を変更します。

<add key="RouteDebugger:Enabled" value="true" /><appSettings>ブロックで

デフォルトのルート ハンドラがルート テーブルの一番下にあることを確認してください。

于 2013-06-27T11:19:55.733 に答える
1

ハンドラーを web.config ハンドラー セクションに追加してから、ルート マッピングで無視することをお勧めします。ただし、独自のソリューションを使用する場合は、カスタム ルート クラスを作成し、GetVirtualPath メソッドを ovveride する必要があります。ルートを登録するためのサンプル コードは次のとおりです。

 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 クラス:

 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 生成の対象とは見なされないため、これが機能します。

以下は、VirtualPathData の結果をチェックする MVC のコードです。

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;
}
于 2013-06-27T12:58:22.537 に答える