サーチ…


備考

ミドルウェアは、アプリケーション・パイプラインの次のコンポーネントに要求を処理する方法を決定し、それをアプリケーションに渡すかどうかを決定するソフトウェア・コンポーネントです。各ミドルウェアには、要求に応じて異なる具体的な役割とアクションがあります。

ExceptionHandlerミドルウェアを使用してカスタムJSONエラーをClientに送信する

カスタムエラーを表すクラスを定義します。

public class ErrorDto
{
   public int Code { get; set; }
   public string Message { get; set; }

   // other fields

   public override string ToString()
   {
      return JsonConvert.SerializeObject(this);
   }
}

次に、次のExceptionHandlerミドルウェアをConfigureメソッドに配置します。ミドルウェアの順序が重要であることに注意してください。

app.UseExceptionHandler(errorApp =>
    {
        errorApp.Run(async context =>
        {
            context.Response.StatusCode = 500; // or another Status 
            context.Response.ContentType = "application/json";

            var error = context.Features.Get<IExceptionHandlerFeature>();
            if (error != null)
            {
                var ex = error.Error;

                await context.Response.WriteAsync(new ErrorDto()
                {
                    Code = <your custom code based on Exception Type>,
                    Message = ex.Message // or your custom message
                    
                    ... // other custom data
                }.ToString(), Encoding.UTF8);
            }
        });
    });

レスポンスを設定するミドルウェアContentType

ヘッダーが送信される前に発生する最後のイベントであるため、 HttpContext.Response.OnStartingコールバックを使用することが考えられます。ミドルウェアのInvokeメソッドに以下を追加します。

public async Task Invoke(HttpContext context)
{
    context.Response.OnStarting((state) =>
    {
        if (context.Response.StatusCode == (int)HttpStatusCode.OK)
        {
           if (context.Request.Path.Value.EndsWith(".map"))
           {
             context.Response.ContentType = "application/json";
           }
        }          
        return Task.FromResult(0);
    }, null);

    await nextMiddleware.Invoke(context);
}

ミドルウェアチェーンを介してデータを渡す

ドキュメントから:

HttpContext.Itemsコレクションは、特定の要求の処理中に必要なデータを格納するのに最適な場所です。その内容は、リクエストごとに破棄されます。これは、要求中に異なる時点で動作するコンポーネントまたはミドルウェア間で通信する手段として最もよく使用され、パラメータまたは戻り値を渡すための相互に直接の関係はありません。

HttpContext.Itemsは、 IDictionary<object, object>型の単純な辞書コレクションです。このコレクションは

  • HttpRequestの開始から利用可能
  • 各要求の終わりに破棄されます。

キー入りのエントリに値を割り当てたり、指定されたキーの値を要求するだけでアクセスできます。

たとえば、単純なミドルウェアの中には、Itemsコレクションに何かを追加するものがあります。

app.Use(async (context, next) =>
{
    // perform some verification
    context.Items["isVerified"] = true;
    await next.Invoke();
});

パイプラインの後半で、別のミドルウェアがアクセスする可能性があります。

app.Run(async (context) =>
{
    await context.Response.WriteAsync("Verified request? " + context.Items["isVerified"]);
});

実行、マップ、使用

走る

チェーンを終了します。これ以降、他のミドルウェアメソッドは実行されません。パイプラインの最後に配置する必要があります。

app.Run(async context =>
{
    await context.Response.WriteAsync("Hello from " + _environment);
});

つかいます

次の委任の前後にアクションを実行します。

app.Use(async (context, next) =>
{
    //action before next delegate
    await next.Invoke(); //call next middleware
    //action after called middleware
});

それがどのように動作するかのイラストレーション: ここに画像の説明を入力

MapWhen

分岐パイプラインを有効にします。条件が満たされた場合、指定されたミドルウェアを実行します。

private static void HandleBranch(IApplicationBuilder app)
{
    app.Run(async context =>
    {
        await context.Response.WriteAsync("Condition is fulfilled");
    });
}

public void ConfigureMapWhen(IApplicationBuilder app)
{
    app.MapWhen(context => {
        return context.Request.Query.ContainsKey("somekey");
    }, HandleBranch);
}

地図

MapWhenに似ています。ユーザーが要求したパスがパラメータで指定されたパスに等しい場合にミドルウェアを実行します。

private static void HandleMapTest(IApplicationBuilder app)
{
    app.Run(async context =>
    {
        await context.Response.WriteAsync("Map Test Successful");
    });
}

public void ConfigureMapping(IApplicationBuilder app)
{
    app.Map("/maptest", HandleMapTest);

}

ASP.net Core Docsに基づいて



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow