MapGetで作成したエンドポイントでURLのルーティング パラメーターを取得する - ASP.NET Core

MapGetで作成したエンドポイントでURLのルーティング パラメーターを取得するコードを紹介します。

概要

こちらの記事ではMapGetメソッドを利用してシンプルなエンドポイントを作成しましたが、MapGetで作成したエンドポイントで、URLパラメーターを取得することもできます。パラメーターを取得するにはパラメーターが含まれたURLパターンをMapGetのパターンに与えてURLを受け取れる状態にします。処理部分では、HttpContextのGetRouteValue()メソッドを呼び出すことでURLのパラメーターを取得できます。
ただし、デフォルトの雛型のコードでは、GetRouteValueメソッドの呼び出しができないため、usingに using Microsoft.AspNetCore.Routing;を追記する必要があります。

プログラム例

事前準備

ASP.NET Core Webアプリケーションプロジェクトを作成します。手順はこちらの記事を参照してください。

コード

下記のコードを記述します。
Startup.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.AspNetCore.Routing; //この行を追加!

namespace RootingEndpoint
{
  public class Startup
  {
    // This method gets called by the runtime. Use this method to add services to the container.
    // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
    public void ConfigureServices(IServiceCollection services)
    {
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
      if (env.IsDevelopment()) {
        app.UseDeveloperExceptionPage();
      }

      app.UseRouting();

      app.UseEndpoints(endpoints =>
      {
        endpoints.MapGet("/view/{query}", async context =>
        {
          string paramstr = (string)context.GetRouteValue("query");
          await context.Response.WriteAsync("Hello ASP.NET Core World EndPoint!:"+paramstr);
        });
      });
    }
  }
}

解説

ルーティングのコードに関してはこちらの記事を参照してください。
  app.UseRouting();

  app.UseEndpoints(endpoints =>
  {
   // ...中略...
 });

エンドポイントの記述が下記のコードになります。MapGetメソッドのパターンに /view/{query} を与えていますので、(アプリケーションルートURL)/view/(パラメータ値) のURLをこのエンドポイントでは処理できます。
処理部分では、GetRouteValue() メソッドを呼び出し、URLの{query}パラメーター部の値を取得します。"Hello ASP.NET Core World EndPoint!:" のメッセージと取得した値をレスポンスとして返します。
  endpoints.MapGet("/view/{query}", async context =>
  {
    string paramstr = (string)context.GetRouteValue("query");
    await context.Response.WriteAsync("Hello ASP.NET Core World EndPoint!:"+paramstr);
  });

実行結果

プロジェクトを実行し、(アプリケーションルートURL)/view/penta のURLにアクセスします。"Hello ASP.NET Core World EndPoint!" のメッセージとURLに入力したパラメーターの値 "penta" がページに表示されていることが確認できます。


パラメーター部分を "AhiRun" に変更してアクセスしてみます。ページの表示内容も変化することが確認できます。


(アプリケーションルートURL)/view/ のURLにアクセスした場合は、パターンにマッチしないため、Not Foundのエラーが表示されます。

参考 : パラメーターが指定されなかった場合でもMapGetの処理を実行したい場合

先のコードでは(アプリケーションルートURL)/view/ のURLにアクセスした場合は、パターンにマッチしないため、Not Foundのエラーが表示されましたが、パラメータが無くても処理をした場合があります。パラメーターが無い場合でもマッチさせる場合は下記の書式を利用します。
{(パラメーター名)?}

先のコードのConfigureを下記のコードに変更します。
Startup.cs Configureメソッド
  public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  {
    if (env.IsDevelopment()) {
      app.UseDeveloperExceptionPage();
    }

    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
      endpoints.MapGet("/view/{query?}", async context =>
      {
        string paramstr = (string)context.GetRouteValue("query");
        await context.Response.WriteAsync("Hello ASP.NET Core World EndPoint!:"+paramstr);
      });
    });
  }

解説

MapGetメソッドに与えるパターンを "/view/{query?}" に変更しました。{query?}部分に?が追加されたことでパラメータが無い場合もマッチする動作になります。

実行結果

プロジェクトを実行します。Webブラウザで (アプリケーションルートURL)/view/ のURLにアクセスします。先のコードと違いNoe Foundエラーは発生せず、MapGetの処理が実行されます。


著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2019-10-27
作成日: 2019-10-27
iPentec all rights reserverd.