wangkanai/wangkanai

Validate that UseDetection() is before UseRouting()

wangkanai opened this issue · 2 comments

This is middleware pipeline is causing a bug #350. Need away to add validation that app.UseRouting() is not in the middleware pipe before app.UseDetection()`.

Before - Failed

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseStaticFiles();

    app.UseDetection();
    
    app.UseRouting();

    app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); });
}

image

After - Pass

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseStaticFiles();

    app.UseRouting();

    app.UseDetection();      

    app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); });
}

image

private static void VerifyEndpointRoutingMiddlewareIsRegistered(IApplicationBuilder app, out DefaultEndpointRouteBuilder endpointRouteBuilder)
{
    if (!app.Properties.TryGetValue(EndpointRouteBuilder, out var obj))
    {
        var message =
            $"{nameof(EndpointRoutingMiddleware)} matches endpoints setup by {nameof(EndpointMiddleware)} and so must be added to the request " +
            $"execution pipeline before {nameof(EndpointMiddleware)}. " +
            $"Please add {nameof(EndpointRoutingMiddleware)} by calling '{nameof(IApplicationBuilder)}.{nameof(UseRouting)}' inside the call " +
            $"to 'Configure(...)' in the application startup code.";
        throw new InvalidOperationException(message);
    }

    // If someone messes with this, just let it crash.
    endpointRouteBuilder = (DefaultEndpointRouteBuilder)obj;

    // This check handles the case where Map or something else that forks the pipeline is called between the two
    // routing middleware.
    if (!object.ReferenceEquals(app, endpointRouteBuilder.ApplicationBuilder))
    {
        var message =
            $"The {nameof(EndpointRoutingMiddleware)} and {nameof(EndpointMiddleware)} must be added to the same {nameof(IApplicationBuilder)} instance. " +
            $"To use Endpoint Routing with 'Map(...)', make sure to call '{nameof(IApplicationBuilder)}.{nameof(UseRouting)}' before " +
            $"'{nameof(IApplicationBuilder)}.{nameof(UseEndpoints)}' for each branch of the middleware pipeline.";
        throw new InvalidOperationException(message);
    }
}

Refer https://github.com/dotnet/aspnetcore/blob/master/src/Http/Routing/src/Builder/EndpointRoutingApplicationBuilderExtensions.cs

This should help catch the easy mistake like the one i had.

image