バックグラウンド
まず背景を説明します。私は、現在 IIS でホストされている OWIN 経由で構成された Web API を使用するバックエンド サーバーを、将来的には他の OWIN サポート ホストと組み合わせて、AngularJS を使用するフロントエンドに結合しようとするプロジェクトに取り組んでいます。
AngularJS フロントエンドは完全に静的コンテンツです。MVC/Razor、WebForms、Bundles などのサーバー側のテクノロジ、およびフロントエンドとそれが使用するアセットに関係するものはすべて回避し、代わりに Node.js、Grunt/Gulp などを使用した最新かつ最高の手法を採用します。 . CSS のコンパイル、バンドル、ミニフィケーションなどを処理します。ここでは説明しない理由により、フロントエンド プロジェクトとサーバー プロジェクトを同じプロジェクト内の別々の場所に保持します (ホスト プロジェクトにすべてを直接貼り付けるのではなく (crud を参照)下図)。
MyProject.sln
server
MyProject.Host
MyProject.Host.csproj
Startup.cs
(etc.)
frontend
MyProjectApp
app.js
index.html
MyProjectApp.njproj
(etc.)
したがって、フロントエンドに関する限り、私がする必要があるのは、ホストに静的コンテンツを提供させることだけです。Express.js では、これは簡単です。OWIN では、Microsoft.Owin.StaticFilesミドルウェアを使用してこれを簡単に行うことができました。うまく機能します (非常に滑らかです)。
これが私のOwinStartup
構成です:
string dir = AppDomain.CurrentDomain.RelativeSearchPath; // get executing path
string contentPath = Path.GetFullPath(Path.Combine(dir, @"../../../frontend/MyProjectApp")); // resolve nearby frontend project directory
app.UseFileServer(new FileServerOptions
{
EnableDefaultFiles = true,
FileSystem = new PhysicalFileSystem(contentPath),
RequestPath = new PathString(string.Empty) // starts at the root of the host
});
// ensure the above occur before map handler to prevent native static content handler
app.UseStageMarker(PipelineStage.MapHandler);
キャッチ
基本的に、frontend/MyProjectApp
MyProject.Host のルート内にあるかのようにすべてをホストします。当然のことながら、存在しないファイルを要求すると、IIS は 404 エラーを生成します。
これは AngularJS アプリであり、html5mode
. index.html
ユーザーが AngularJS (この例では物理的に存在するファイル以外のもの) にドロップすると、そのルートが AngularJS アプリで有効な場合でも、404 が返されます。index.html
したがって、要求されたファイルが存在しない場合にファイルを返すために OWIN ミドルウェアが必要であり、それが本当に 404 であるかどうかを AngularJS アプリに判断させます。
SPA と AngularJS に精通している場合、これは通常の簡単な方法です。MVC または ASP.NET ルーティングを使用している場合は、 my を返す MVC コントローラーへのデフォルト ルートを設定するだけで済みますindex.html
。ただし、私は MVC を使用していないと既に述べており、これを可能な限りシンプルかつ軽量に保つように努めています。
このユーザーは同様のジレンマを抱えていて、IIS の書き換えで解決しました。私の場合、それは機能しません。なぜなら、a) 書き換え URL モジュールが見つけられる場所に私のコンテンツが物理的に存在しないため、常に返さindex.html
れ、b) IIS に依存しないが内部で処理されるものが欲しいからです。フレキシブルに使えるOWINミドルウェア。
TL;DNR 私、大声で泣いてしまいました。
簡単に、どうすれば 404 Not Found をインターセプトし、OWIN ミドルウェアを使用して (注:リダイレクトしないで) my FileServer
-servedのコンテンツを返すことができindex.html
ますか?