ASP.NET Core и угловое перенаправление API 404 вызовов - PullRequest
0 голосов
/ 02 октября 2018

Я использую ASP.NET Core и Angular CLI.

Вызовы API выполняются через маршрутизацию '/ api / etc', все остальное - статическая или угловая маршрутизация.

У меня все работает нормально, пока я не столкнулся с 404 (не найденным) в одномиз моих вызовов API.И это вызвало перенаправление на "/".

startup.cs

. UseStatusCodePagesWithReExecute перенаправляет все вызовы на" / ", что является источником моих проблем.

A.Мне нужно, чтобы 404 вызова (без '/ api / **') заканчивались на '/', чтобы Angular мог с этим справиться.

B.Мне нужно, чтобы вызовы / api / ** не игнорировались при любом ответе.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    // This is needed to get Angular handling the routing
    app.UseStatusCodePagesWithReExecute("/");

    app.UseDefaultFiles();
    app.UseStaticFiles();
    app.UseCookiePolicy();

    app.UseMvc();
}

Я пробовал app.MapWhen , но он не делал то, что делалобещали.

1 Ответ

0 голосов
/ 02 октября 2018

Хорошо, я взял исходный UseStatusCodePagesWithReExecute и добавил дополнительный, если проверить, произошла ли ошибка в вызове API.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    UseStatusCodePagesWithReExecute(app, "/", null);
    app.UseMvc();

    app.UseDefaultFiles();
    app.UseStaticFiles();
    app.UseCookiePolicy();

    app.UseMvc();
}


public static IApplicationBuilder UseStatusCodePagesWithReExecute(
        IApplicationBuilder app,
        string pathFormat,
        string queryFormat = null)
{
    if (app == null)
    {
        throw new ArgumentNullException(nameof(app));
    }

    return app.UseStatusCodePages(async context =>
    {
        var newPath = new PathString(string.Format(CultureInfo.InvariantCulture, pathFormat, context.HttpContext.Response.StatusCode));
        var formatedQueryString = queryFormat == null ? null : string.Format(CultureInfo.InvariantCulture, queryFormat, context.HttpContext.Response.StatusCode);
        var newQueryString = queryFormat == null ? QueryString.Empty : new QueryString(formatedQueryString);

        // Ignore API calls << this if is added 
        if (context.HttpContext.Request.Path.StartsWithSegments("/api", StringComparison.OrdinalIgnoreCase))
        {
            await context.Next(context.HttpContext);
            return;
        }

        var originalPath = context.HttpContext.Request.Path;
        var originalQueryString = context.HttpContext.Request.QueryString;
        // Store the original paths so the app can check it.
        context.HttpContext.Features.Set<IStatusCodeReExecuteFeature>(new StatusCodeReExecuteFeature()
        {
            OriginalPathBase = context.HttpContext.Request.PathBase.Value,
            OriginalPath = originalPath.Value,
            OriginalQueryString = originalQueryString.HasValue ? originalQueryString.Value : null,
        });

        context.HttpContext.Request.Path = newPath;
        context.HttpContext.Request.QueryString = newQueryString;
        try
        {
            await context.Next(context.HttpContext);
        }
        finally
        {
            context.HttpContext.Request.QueryString = originalQueryString;
            context.HttpContext.Request.Path = originalPath;
            context.HttpContext.Features.Set<IStatusCodeReExecuteFeature>(null);
        }
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...