web-dev-qa-db-ja.com

ASP.NET Core Response.End()?

特定のクライアントルートがサーバーで処理されないようにするミドルウェアを作成しようとしています。私は応答を短絡させる多くのカスタムミドルウェアクラスを見ました

context.Response.End();

IntellisenseにはEnd()メソッドがありません。応答を終了してHTTPパイプラインの実行を停止するにはどうすればよいですか?前もって感謝します!

public class IgnoreClientRoutes
{
    private readonly RequestDelegate _next;
    private List<string> _baseRoutes;

    //base routes correcpond to Index actions of MVC controllers
    public IgnoreClientRoutes(RequestDelegate next, List<string> baseRoutes) 
    {
        _next = next;
        _baseRoutes = baseRoutes;

    }//ctor


    public async Task Invoke(HttpContext context)
    {
        await Task.Run(() => {

            var path = context.Request.Path;

            foreach (var route in _baseRoutes)
            {
                Regex pattern = new Regex($"({route}).");
                if(pattern.IsMatch(path))
                {
                    //END RESPONSE HERE

                }

            }


        });

        await _next(context);

    }//Invoke()


}//class IgnoreClientRoutes
14

従来のASP.NETパイプラインはもう存在しないため、Endはもう存在しません。ミドルウェアはパイプラインです。その時点でリクエストの処理を停止したい場合は、次のミドルウェアを呼び出さずに戻ります。これにより、パイプラインが効果的に停止します。

完全にではありませんが、スタックが展開され、一部のミドルウェアはまだ一部のデータをResponseに書き込むことができるためですが、アイデアはわかります。あなたのコードから、パイプラインを下るさらなるミドルウェアの実行を回避したいようです。

編集:コードでそれを行う方法は次のとおりです。

public class Startup
{
    public void Configure(IApplicationBuilder app)
    {
        app.Use(async (http, next) =>
        {
            if (http.Request.IsHttps)
            {
                // The request will continue if it is secure.
                await next();
            }

            // In the case of HTTP request (not secure), end the pipeline here.
        });

        // ...Define other middlewares here, like MVC.
    }
}
12
gretro

終了メソッドはもうありません。ミドルウェアでは、パイプラインでnext delegateを呼び出すと、次のミドルウェアに移動して要求を処理し、続行します。それ以外の場合は、リクエスト。次のコードは、next.Invokeメソッドを呼び出すサンプルミドルウェアを示しています。これを省略した場合、応答は終了します。

using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;

namespace MiddlewareSample
{
    public class RequestLoggerMiddleware
    {
        private readonly RequestDelegate _next;
        private readonly ILogger _logger;

        public RequestLoggerMiddleware(RequestDelegate next, ILoggerFactory loggerFactory)
        {
            _next = next;
            _logger = loggerFactory.CreateLogger<RequestLoggerMiddleware>();
        }

        public async Task Invoke(HttpContext context)
        {
            _logger.LogInformation("Handling request: " + context.Request.Path);
            await _next.Invoke(context);
            _logger.LogInformation("Finished handling request.");
        }
    }
}

コードに戻るには、パターンが一致した場合にメソッドから戻る必要があります。

詳細については、Microsoftコアドキュメントからこのドキュメントを参照してください。 https://docs.Microsoft.com/en-us/aspnet/core/fundamentals/middleware

4
akazemis