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ファイルです。 (このプロジェクトの外側で処理)本プロジェクトでは、認証なし
- このプロジェクトが実行されている私は(プロジェクトの任意の場所に任意のOWIN構成がありません何startup.cs、ノーstartup.auth.csなど)
アップデート2:絶望の行為で
は、私が行っていない2つの新しいCONTRを追加しました既定のルートに一致するollers - 私たちは "Path1"と "Path2"と呼んで、デフォルトのコントローラ({controller}/{action}/{id})に一致させます。これは、DARN ROUTECONFIGファイルANYMOREではなく、まだマッチングにINSISTS。これは私のベースケース(http://myapp/path1
とhttp://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");
}
}
}
:
は、ここに私のコードの最新の化身です。適切な古いデフォルトルートは、設定には存在しませんが、動作するように見えます。
私はここで間違っていますか?!?!?!?!?
あなたの 'RouteConfig.cs'ファイルを表示してください。 – Nkosi
これを上に追加します。 – SyracuseCheer