|
検索
タグ
ASP.NET
.NET
ASP.NET MVC
F#
Visual Studio
Azure
ASP.NET Core
ライトニングトーク
Plone
Selenium
AJAX
C#
jQuery
JavaScript
SQL Server
ADO.NET Entity Framework
WebMatrix
LINQ
EFCore
TypeScript
カテゴリ
最新の記事
最新のコメント
記事ランキング
最新のトラックバック
以前の記事
2026年 01月 2025年 12月 2025年 11月 2025年 10月 2025年 09月 2025年 08月 2025年 07月 2025年 06月 2025年 05月 2025年 04月 2025年 03月 2025年 02月 2024年 12月 2024年 11月 2024年 10月 2024年 09月 2024年 08月 2024年 04月 2024年 03月 2024年 02月 2024年 01月 2023年 12月 2023年 11月 2023年 10月 2023年 09月 2023年 08月 2023年 07月 2023年 06月 2023年 05月 2023年 04月 2023年 03月 2023年 02月 2023年 01月 2022年 12月 2022年 11月 2022年 10月 2022年 09月 2022年 08月 2022年 07月 2022年 06月 2022年 05月 2022年 04月 2022年 03月 2022年 02月 2022年 01月 2021年 12月 2021年 11月 2021年 10月 2021年 09月 2021年 08月 2021年 07月 2021年 06月 2021年 05月 2021年 04月 2021年 03月 2021年 02月 2021年 01月 2020年 12月 2020年 11月 2020年 10月 2020年 09月 2020年 08月 2020年 07月 2020年 06月 2020年 05月 2020年 04月 2020年 03月 2020年 02月 2020年 01月 2019年 12月 2019年 11月 2019年 10月 2019年 09月 2019年 08月 2019年 07月 2019年 06月 2019年 05月 2019年 04月 2019年 03月 2019年 02月 2019年 01月 2018年 12月 2018年 11月 2018年 10月 2018年 09月 2018年 08月 2018年 07月 2018年 06月 2018年 05月 2018年 04月 2018年 03月 2018年 02月 2018年 01月 2017年 12月 2017年 11月 2017年 10月 2017年 09月 2017年 08月 2017年 07月 2017年 06月 2017年 05月 2017年 04月 2017年 02月 2017年 01月 2016年 12月 2016年 11月 2016年 10月 2016年 09月 2016年 08月 2016年 07月 2016年 06月 2016年 05月 2016年 04月 2016年 03月 2016年 02月 2016年 01月 2015年 12月 2015年 11月 2015年 10月 2015年 09月 2015年 08月 2015年 07月 2015年 05月 2015年 04月 2015年 03月 2015年 02月 2015年 01月 2014年 12月 2014年 11月 2014年 10月 2014年 09月 2014年 08月 2014年 06月 2014年 04月 2014年 03月 2014年 02月 2014年 01月 2013年 12月 2013年 10月 2013年 09月 2013年 08月 2013年 07月 2013年 06月 2013年 05月 2013年 04月 2013年 03月 2013年 02月 2013年 01月 2012年 12月 2012年 11月 2012年 10月 2012年 09月 2012年 08月 2012年 07月 2012年 06月 2012年 05月 2012年 04月 2012年 03月 2012年 02月 2012年 01月 2011年 12月 2011年 11月 2011年 10月 2011年 09月 2011年 08月 2011年 07月 2011年 06月 2011年 05月 2011年 04月 2011年 03月 2011年 02月 2011年 01月 2010年 12月 2010年 11月 2010年 10月 2010年 09月 2010年 08月 2010年 07月 2010年 06月 2010年 05月 2010年 04月 2010年 03月 2010年 02月 2010年 01月 2009年 12月 2009年 10月 2009年 09月 2009年 07月 2009年 06月 2009年 05月 2009年 04月 2009年 03月 2009年 02月 2009年 01月 2008年 12月 2008年 11月 2008年 10月 2008年 09月 2008年 08月 2008年 07月 2008年 06月 2008年 05月 2008年 04月 2008年 03月 2008年 02月 2008年 01月 2007年 12月 2007年 11月 2007年 04月 2007年 03月 2007年 02月 2007年 01月 2006年 11月 2006年 10月 2006年 09月 2006年 08月 2006年 07月 |
2022年 07月 25日
スタンドアロン Blazor Wasm アプリを Win11 Pro の IIS に配置とあるスタンドアロンの Blazor WebAssembly アプリを、手元の Windows 11 Pro 上の IIS に配置する機会があった。 「dotnet publish -c Release」と実行して発行を行ない、生成された「./bin/Release/net6.0/publish」フォルダ内のファイル一式を C:\inetpub\wwwroot フォルダに配置して、はい完了。 ...のはずだったのだが、配置完了して https://localhost/ を Web ブラウザで開いたところ、下記内容の IIS による HTTP 500 エラーページが表示されてしまった。 HTTP Error 500.19 - Internal Server Error The requested page cannot be accessed because the related configuration data for the page is invalid. 今回発行したのはスタンドアロンな Blazor WebAssembly であり、ASP.NET Core ホストされた Blazor WebAssembly ではない。つまりサーバー側プロセスがない、言ってみれば画像ファイル群などと大差ない、ただの静的コンテンツ群を配置しようとしただけである。 にも関わらず、サーバー側エラーである HTTP 500 が発生したということはどういうことか。 最初は理由がわからず、問題切り分けになるかどうかもわからないままに、何となく、この状況から、もうひとつ別の ASP.NET Core ホストされた Blazor WebAssembly プロジェクトを発行し、発行後コンテンツを C:\inetpub\wwwroot フォルダに配置してみた。 そうしたところ、こちらはさっくり動作してしまった。 同じ IIS 上の配置なのに、両者の違いは何だろうか? エラーメッセージの中にこそ答えがあるはず解決できないままに改めて腰を据えて、先の IIS による HTTP 500 エラーのメッセージをよく読む。絶対に答えはエラーメッセージの中にあるはずだ。心を落ち着けてよく読むと「the related configuration data for the page is invalid.」が肝心であることがわかってきた。 つまり、「当該ページ用の関連する構成データが不正である」ということで、ここでいう「構成データ」とは web.config のことに違いない。 実際、スタンドアロンな Blazor WebAssembly アプリの発行後コンテンツを見ると、web.config ファイルが含まれているのがわかる。 ![]() そこで、この発行後コンテンツに含まれている web.config の記載内容をテキストエディタで開いて覗いてみる。 web.config の冒頭は大して珍しいものはない。下記のとおり、Blazor WebAssembly ならではのファイル種別、とくに .dll とか .wasm とかが正しくブラウザに応答返信されるよう、MIME-Type を正しく再設定しているだけである。 しかし web.config の後ろのほうに面白いものを見つけた。下記である。 上記は何かというと、いわゆる「URL の書き換え (Rewrite)」についての構成だ。 特に URL 書き換えルールの 2つ目、つまり上記 XML 中の rule ノードの 2 つ目であるが、これは SPA のフォールバックページを返す仕組みを実現している仕掛けだ。 例えば Web ブラウザからの HTTP 要求が「https://localhost/counter」だとして、しかし件の Blazor WebAssembly アプリには該当する静的ファイルは存在しない。 この場合に、上記 IIS の「URL の書き換え」によって、要求を「https://localhost/」に振り向ける、というのである。 すると、続いての「既定のドキュメント」の仕組みにより、「https://localhost/index.html」の内容がブラウザに返される、という訳である。 あとは Web ブラウザ上で、そうやって読み込まれたフォールバックページの内容を元に Blazor WebAssembly アプリコンテンツがブラウザ上に読み込まれ、Blazor WebAssembly のルーティングによってめでたく「counter」ページが表示される、という寸法だ。 GitHub Pages への配置の場合などのようにサーバー側をどうにも構成のしようがない場合は、該当コンテンツが見つからない場合 (HTTP 404) に返される HTML ファイル「404.html」にフォールバックページの内容 (つまりは index.html と同じ内容) を記載したりして凌いだりする。 が、なるほど、IIS への配置の際は、Blazor WebAssembly プロジェクトの発行後コンテンツに含まれている web.config、およびその web.config 内に記載されている「URL 書き換え」ルールによって、SPA のフォールバックページ返却の仕組みが実現されていたのである。 URL 書き換えモジュール!ここでようやくはたと気がついた。 そういえば、IIS の「URL 書き換え」の機能って、別途追加でインストールが要るんではなかったか? インターネットで検索してみると、果たしてそのとおり。 下記 URL から「URL 書き換え」、すなわち、「URL Rewrite」モジュールをダウンロードしてインストールするべきだったのだ。 「URL 書き換え (URL Rewrite)」モジュールをインストール完了後、再度、当該スタンドアロン Blazor WebAssembly アプリの発行後コンテンツを配置しなおし、改めて「https://localhost」を Web ブラウザで開いてみると、ようやく期待どおりのページが表示された。 もちろん、Web ブラウザのアドレスバーに「https://localhost/counter」と入力したりその後再読込を実行したりしても、ちゃんと SPA フォールバックの仕組みで、期待どおり「Counter」ページが表示された。 補足ちなみに、ASP.NET Core ホストな Blazor WebAssembly プロジェクトであれば、「URL 書き換え」モジュールが未インストールな IIS 上でも難なく動作したのは、IIS の「URL 書き換え」モジュールがやっているのと同じような SPA フォールバックページ返却の仕組みを、ホストしている ASP.NET Core サーバーが担当しているからである。 .NET SDK 標準のプロジェクトテンプレートから新規作成した ASP.NET Core ホストな Blazor WebAssembly プロジェクトであれば、ASP.NET Creo サーバー側の Program.cs で app.MapFallbackToFile("index.html");の1行が最後のほうにあると思うが、それこそが、スタンドアロンな Blazor WebAssembly プロジェクトを配置した際には IIS の「URL 書き換え」モジュールにやらせていた、フォールバックページ返却の仕組みである次第。
by developer-adjust
| 2022-07-25 22:26
| .NET
|
ファン申請 |
||