Пустельга больше не разделяет путь и базу пути

Я создал пример приложения фабричной службы в.NET Core и попытался зарегистрировать URL-адреса в Kestrel, но получил ошибку ниже. Пустельга больше не разделяет путь и основание пути. База путей, указанная в UseUrls(), больше не будет работать. Чтобы указать базу пути, используйте метод расширения IApplicationBuilder.UsePathBase().

ServerUrl будет: http://localhost:8597/School/LOCAL

Ниже приведен код в службах без сохранения состояния

public Task<string> OpenAsync(CancellationToken cancellationToken)
    {
        var endpoint = FabricRuntime.GetActivationContext().GetEndpoint(this._endpointName);
        string serverUrl = $"{endpoint.Protocol}://{FabricRuntime.GetNodeContext().IPAddressOrFQDN}:{endpoint.Port}";

        // serverUrl = http://localhost:8597
        serverUrl = serverUrl + "/School/LOCAL/";

        webHost = new WebHostBuilder()
                        .UseKestrel()
                        .UseContentRoot(Directory.GetCurrentDirectory())
                        .UseStartup<Startup>()
                        .UseUrls(serverUrl)
                        .Build();

        webHost.Start();

        return Task.FromResult(serverUrl);
    }

Поэтому я изменил свой код, как показано ниже, и попытался зарегистрировать свой URL с помощью IApplicationBuilder.UsePathBase(). Тем не менее, я заметил ниже поведение.

http://localhost:8597/School/LOCAL/api/getstudentnames - не работает http://localhost:8597/api/getstudentnames - работает

Изменения кода с использованием UsePathBase

CommunicationListener.CS

 public Task<string> OpenAsync(CancellationToken cancellationToken)
    {
        var endpoint = FabricRuntime.GetActivationContext().GetEndpoint(this._endpointName);
        string serverUrl = $"{endpoint.Protocol}://{FabricRuntime.GetNodeContext().IPAddressOrFQDN}:{endpoint.Port}";
        webHost = new WebHostBuilder()
                        .UseKestrel()
                        .UseContentRoot(Directory.GetCurrentDirectory())
                        .UseStartup<Startup>()
                        .UseUrls(serverUrl)
                        .Build();

        webHost.Start();

        return Task.FromResult(serverUrl);
    }

Startup.cs

 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        const string PathBase = "/School/LOCAL/";
        app.UsePathBase(PathBase);
    }

1 ответ

Я думаю, что это работает, как ожидалось.

AFAIK, то UsePathBase() добавлена ​​функция удаления rootPath из фактического пути, полученного в запросе сценариев, когда клиент запрашивает что-либо через обратный прокси-сервер, который направляет запросы на основе VirtualPath и исходный URL-адрес должен быть переписан в службе, чтобы понять это.

Как пример:

  • API принимает запросы на http://<anyip>/users/123
  • API выставляется за настройкой прокси как виртуальный каталог, такой как http://domain/api
  • Звонок клиента http://domain/api/users/123
  • Прокси получит звонок как http://domain/api/users/123 и вперед, как есть API, http://domain/users/123
  • API не распознает URL и возвращает 404,

В этом случае, если вы настраиваете с UserPathBase("api") это лишит api значение из URL для сопоставления с маршрутом, который у вас был раньше.

Пример - тот, о котором сообщают по этой проблеме, как ниже:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        app.UsePathBase("/basepath");

        app.Map("/ping", map => map.Run(async 
            ctx => await ctx.Response.WriteAsync("pong")));

        app.UseMvc();
    }

Это будет работать для обоих URL ниже:

  • /basepath/ping
  • /ping

Поскольку basepath в первом будет удален и API всегда будет видеть второй вариант.

Это объясняет более подробно, и это показывает проблему, похожую на вашу.

Другая проблема, когда API возвращает внутренние URL-адреса, например, если нужно сгенерировать ссылку на пользователя, не зная, что он находится за прокси-сервером, он вернет http://<anyip>/users/123 где должен быть правильный URL http://<anyip>/api/users/123,

Таким образом, API должен выполнять работу, которую должен выполнять прокси-сервер, но некоторые прокси-серверы являются просто мостом и не обрабатывают эти случаи.