つばろぐ

福岡のエンジニアによる技術的な備忘録です。

ASP.NET Core Razor Pagesにおける単一ページのルーティング

ASP.NET Core Razor Pagesでのルーティング設定につまづいたので手順を残しておきます。
ASP.NET Core MVCをよく使うため、単純に慣れの問題。

docs.microsoft.com

RazorPagesRouteSample
|--Areas
| |--Identity
| | |--Data
| | | |--RazorPagesRouteSampleIdentityDbContext.cs
| | |--IdentityHostingStartup.cs
| | |--Pages
| | | |--Account
| | | | |--Login.cshtml
| | | | |--Login.cshtml.cs
| | | |--_ValidationScriptsPartial.cshtml
| | | |--_ViewStart.cshtml
|--Pages
| |--_ViewImports.cshtml
| |--_ViewStart.cshtml
| |--Error.cshtml
| |--Error.cshtml.cs
| |--Index.cshtml
| |--Index.cshtml.cs
| |--Privacy.cshtml
| |--Privacy.cshtml.cs
| |--Shared
| | |--_CookieConsentPartial.cshtml
| | |--_Layout.cshtml
| | |--_LoginPartial.cshtml
| | |--_ValidationScriptsPartial.cshtml
| |--YourVoice.cshtml
| |--YourVoice.cshtml.cs
|--Program.cs
|--RazorPagesRouteSample.csproj
|--Startup.cs

上記のディレクトリ構成の場合を例にする。

ページを別名でアクセス可能にするルーティング

例: Pages/Privacy.cshtml へのアクセスを /SitePrivacy で可能にする。

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
        .AddRazorPagesOptions(options =>
            {
                options.Conventions.AddPageRoute("/Privacy", "SitePrivacy/");
            })
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

ページを別名でアクセス可能にするルーティング(パラメーター付き)

例: Pages/YourVoice.cshtml へのアクセスを /Voice/{text?} で可能にする。

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
        .AddRazorPagesOptions(options =>
            {
                options.Conventions.AddPageRoute("/YourVoice", "Voice/{text?}");
            })
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

YourVoice.cshtml

@page "{text?}" //受けるパラメーターを定義

YourVoice.cs

public class YourVoiceModel : PageModel
{
    public void OnGet(string text = null) //パラメーターを引数で受ける
    {
    }
}

エリア内のページへのルーティング

例: Identity エリアにあるログインページへのルーティング

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
        .AddRazorPagesOptions(options =>
            {
                options.Conventions.AddAreaPageRoute("Identity", "/Account/Login", "Login/");
            })
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

なお options.Conventions.AddPageRoute("/Identity/Account/Login", "Login/"); では正しいルーティング設定とならない。

AzureにデプロイしているASP.NET Coreの起動時にエラーが発生したときに読むべきドキュメント

多少限定的な状況下ではありますが、Microsoft AzureにデプロイしているASP.NET Coreの起動時にエラーが発生したときには、こちらのドキュメントを参照するとよいです。

docs.microsoft.com

HTTP 502.5エラーとHTTP 500エラーの2種類あり、それぞれ確認する項目が異なります。

個人的にはASP.NET Coreの起動時にエラーが発生する原因は以下のように考えています。状況を切り分けるポイントというところです。

  • Program.cs または Startup.cs での処理に不備がある
  • Startup.cs で参照している外部リソース(DBなど)に障害が起きている
  • ASP.NET CoreをホストしているWebサーバーそのものに障害が起きている
  • クラウドプラットフォームに障害が起きている

細かな状況や原因は、上記ドキュメントの手法に従ってログを確認して特定することになります。

Azureにデプロイしている場合、Visual Studioからリモートデバッグを行うことができるので、これでさくっと原因特定しちゃいましょう。

docs.microsoft.com

OSS Gate Fukuokaにサポーターとして参加して感じたこと #oss_gate

ブログを書くまでがOSSってことで(謎

2019年1月15日と17日の2日間で開催されたOSS Gate Fukuokaという勉強会に参加してきました。
もともと「OSS Gate」というイベントは東京で開催されているみたいです。

oss-gate-fukuoka.connpass.com

コンセプトとしては

オープンソースソフトウェア(OSS)の開発に参加する」を実際に体験するためのワークショップです。

なので、自分もそれをお手伝いできればいいなぁと思い、サポーターとして参加しました。
ちなみにOSSを体験したい方は「ビギナー」という呼称です。

なにをやった?

基本的にビギナー2人とサポーター1人でチームを組み、ビギナーがテーマにしたOSSに対して、どのような方法でコントリビュート(貢献)できるか、それを実現するための進め方などを手伝い、ゴールの達成をサポートする役割でした。

とにかく「手を動かして慣れよう」という方針なんだろうなと感じました。
ビギナーはOSS Gateのリポジトリにメモ代わりのIssueを作り、アウトプットする習慣をつけるように進んでいきました。

github.com

意外と難しい

両日とも参加して感じた難しさを雑に書いてみます。決して批判ではなく、個人的な感想です。

  1. ビギナー:テーマにするOSSを決めることが難しい(だろう)
  2. ビギナー:なにをコントリビュートしてよいかを決めることが難しい(だろう)
  3. サポーター:どこまでアドバイスしてよいか難しい
  4. サポーター:ビギナーにモチベーションを保ってもらう盛り上げ方が難しい

技術力の大小ではなく、単に慣れの問題かなと思います。

学びもあった

仕事や趣味のなかでGitやGithubを使うことが多く、IssueやPull Requestのある生活に慣れているなかで、ビギナーの方が悩むポイントを知ることができ、どのようにサポートすればよいのかを考える良い機会となりました。

また単純に、初耳のOSSがあったので収穫です。例えばこんなの。

github.com

github.com

github.com

github.com


第1回目の開催でしたがとても楽しめました。次回の開催があれば、また何かしら手伝えたらいいなと思います。