2016-06-23 7 views
2

ASP.NET MVC 5アプリケーションでホストされるAngular 2 spaを開発しました。 /ホーム/インデックス - - 私はすべての要求は、単一のルートに行きたいので、私は、デフォルトルートを削除し、キャッチオールに置き換えてきました:ASP.NET MVC5アプリケーションのキャッチオールルートが無視される

routes.MapRoute(
    name: "spa-catch-all", 
    url: "{*anything}", 
    defaults: new { controller = "Home", action = "Index" }); 

これはRouteConfig.csで唯一のルートでありますファイル。

私はこのように、サーバーのURL過去の任意のパス値なしで自分のアプリケーションをヒットした場合:

http://myserver.org/ 

そして、すべての作品。私はこのようなURLヒットしようとすると:

http://myserver.org/sectionname 

をアプリケーションは、私はこれを試してみて診断するフィル・ハークのルートデバッガNuGetパッケージをインストールして、デバッガがいることを私に言っている404

を返します。私が削除したasp.netのデフォルトルートは私のURLと一致しています。実際、私はキャッチオールルートを見ていません。少なくとも、デバッガによって生成された "All Routes"テーブルには、{* anything}の代わりに{* catchall}が表示されています。

MVCが自分のRouteConfigファイルを無視しているようです。

  • 何が起こっているのですか?
  • 私はデフォルトルートがウェブアプリケーション自体の外のどこにでも定義されているとは思わなかった。私は私のルートテーブルをクリアする必要がありますか?
  • RouteConfigを変更する前に、私の初期のビルドのどこかに何かがキャッシュされていますか?

アップデート1: 公共の静的な無効RegisterRoutes(RouteCollectionルート)

namespace MyAppNamespace 
{ 
    public class RouteConfig 
    { 
     public static void RegisterRoutes(RouteCollection routes) 
     { 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

      routes.MapRoute(
       name: "spa-catch-all", 
       url: "{*anything}", 
       defaults: new { controller = "Home", action = "Index" }); 
     } 
    } 
} 

、私は次のように指摘する必要があります:

ここで完全RouteConfig.csファイルです。 (このプロジェクトの外側で処理)本プロジェクトでは、認証なし

  • はありません
  • ASP.NET 4.6.1下

    • このプロジェクトが実行されている私は(プロジェクトの任意の場所に任意のOWIN構成がありません何startup.cs、ノーstartup.auth.csなど)

    アップデート2:絶望の行為で

    は、私が行っていない2つの新しいCONTRを追加しました既定のルートに一致するollers - 私たちは "Path1"と "Path2"と呼んで、デフォルトのコントローラ({controller}/{action}/{id})に一致させます。これは、DARN ROUTECONFIGファイルANYMOREではなく、まだマッチングにINSISTS。これは私のベースケース(http://myapp/path1http://myapp/path2)でも機能しますが、サブパス(http://myapp/path1/subpath1)ではまだ動作しません。

    私のルート設定が完全​​に無視されている(理由がわからない)か、パス内のすべてのパラメータが期待通りに機能していないことがわかりました。 global.asax.csファイルとrouteconfig.csファイルを(現在のように)添付します。

    using System; 
    using System.Web; 
    using System.Web.Http; 
    using System.Web.Mvc; 
    using System.Web.Routing; 
    
    namespace MyNamespace 
    { 
        public class Global : HttpApplication 
        { 
         void Application_Start(object sender, EventArgs e) 
         { 
          // Code that runs on application startup 
          AreaRegistration.RegisterAllAreas(); 
          GlobalConfiguration.Configure(WebApiConfig.Register); 
          RouteConfig.RegisterRoutes(RouteTable.Routes);    
         } 
        } 
    } 
    
    
    using System.Web.Mvc; 
    using System.Web.Routing; 
    
    namespace MyNamespace 
    { 
        public class RouteConfig 
        { 
         public static void RegisterRoutes(RouteCollection routes) 
         { 
          routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
    
          routes.MapRoute(
           name: "CatchAll", 
           url: "{*any}", 
           defaults: new {controller = "Home", action = "Index", id = UrlParameter.Optional} 
          ); 
         } 
        } 
    } 
    

    私はアイデアがなく、皆さんの提案を聞いて欲しいです。

    アップデート3:さらに絶望の行為で

    、私は実装カスタムルートハンドラを行ってきました。私はそれが今のところうまくいくかどうか気にしない。私は要求をするときにブレークポイントに当たってほしい。

    "SpaRouteHandler"という非常に単純なハンドラを作成しました。このハンドラは、創造的にSpaHandlerというカスタムHttpHandlerを返します。 SpaHandlerは、現時点では何もしません。ただ例外をスローします。私はちょうどダムの事がヒットしていることを確認したい。例外はヒットれることは決してありません

    using System; 
    using System.Web; 
    using System.Web.Http; 
    using System.Web.Mvc; 
    using System.Web.Routing; 
    
    namespace MyNamespace 
    { 
        public class Global : HttpApplication 
        { 
         void Application_Start(object sender, EventArgs e) 
         { 
          // Code that runs on application startup 
          AreaRegistration.RegisterAllAreas(); 
          GlobalConfiguration.Configure(WebApiConfig.Register); 
          RouteConfig.RegisterRoutes(RouteTable.Routes);    
         } 
        } 
    } 
    
    
    
    using System.Web.Mvc; 
    using System.Web.Routing; 
    
    namespace MyNamespace 
    { 
        public class RouteConfig 
        { 
         public static void RegisterRoutes(RouteCollection routes) 
         { 
          routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
    
          RouteValueDictionary defaults = new RouteValueDictionary {{"controller", "Home"}, {"action", "Index"}}; 
          var customRoute = new Route("{*.}", defaults, new SpaRouteHandler()); 
          routes.Add(customRoute); 
         } 
        } 
    } 
    
    
    
    using System.Web; 
    using System.Web.Routing; 
    
    namespace MyNamespace 
    { 
        public class SpaRouteHandler : IRouteHandler 
        { 
         public IHttpHandler GetHttpHandler(RequestContext requestContext) 
         { 
          return new SpaHandler(requestContext); 
         } 
        } 
    } 
    
    
    
    using System; 
    using System.Net; 
    using System.Web; 
    using System.Web.Mvc; 
    using System.Web.Routing; 
    
    namespace MyNamespace 
    { 
        public class SpaHandler : IHttpHandler 
        { 
         public RequestContext LocalRequestContext { get; set; } 
    
         public SpaHandler(RequestContext requestContext) 
         { 
          LocalRequestContext = requestContext; 
         } 
    
         public bool IsReusable 
         { 
          get 
          { 
           return false; 
          } 
         } 
    
         public void ProcessRequest(HttpContext context) 
         { 
          throw new NotImplementedException("Just throw an error please"); 
         } 
        } 
    } 
    

    は、ここに私のコードの最新の化身です。適切な古いデフォルトルートは、設定には存在しませんが、動作するように見えます。

    私はここで間違っていますか?!?!?!?!?

    +0

    あなたの 'RouteConfig.cs'ファイルを表示してください。 – Nkosi

    +0

    これを上に追加します。 – SyracuseCheer

    答えて

    1

    が、これは奇妙なものでした。プロジェクトが最初に作成されたときからWebアプリケーションの名前空間を変更し、ReSharperの調整名前空間リファクタリングツールを使用してプロジェクト全体の名前空間を調整していました。しかし、何らかの理由で、global.asaxファイル内の<Application />タグのInherits=""属性の名前空間参照は変更されませんでした。 DLLの古いバージョンを参照していたので、私のApplication_Startは呼び出されていませんでした。

    一度参照を変更すると、すべてが計画どおりに機能し始めました。

    +0

    過去に自分自身でこれをやったことを+1しなければなりませんでした。 –

    0

    これを試してみてください:結局のところ

    app.UseMvc(routes => 
        { 
         routes.MapRoute(name:"default", template:"{controller=Default}/{action=Index}/{id?}"); 
    
         routes.MapRoute("CatchAll", "{*url}", new {controller = "Default", action = "Index"}); 
        }); 
    
    +0

    このソリューションはMVC 5またはASP.NET Core MVC用ですか? – SyracuseCheer

    +0

    それはMVC5用ですが、私はそれが両方のために動作すると仮定します – AngJobs

    +0

    また、そこにはデフォルトルートは必要ありません。私の場合、キャッチオールはデフォルトルートです。 – SyracuseCheer

    関連する問題