Нулевой WebRootPath в ConfigureServices для размещенного Blazor - PullRequest
0 голосов
/ 09 июля 2020

Я хотел бы получить доступ к веб-пути root из Blazor.Server.Startup.ConfigureServices в решении, размещенном на Blazor.

Я ввел IWebHostEnvironment в конструктор Startup и сохранил его как свойство с именем «WebHostEnvironment». Проблема в том, что в ConfigureServices WebHostEnvironment.WebRootPath всегда имеет значение null.

Я уже подтвердил, что:

  • wwwroot папка существует в моем проекте Blazor.Client.
  • app.UseStaticFiles(); был вызван в Startup.Configure (не уверен, что это необходимо, но это одно из немногих рекомендуемых решений, которые я нашел).

Это похоже на общая проблема (возможно, WebRootPath заполняется только при определенных условиях - например, после публикации / развертывания моего приложения?), однако я нигде не смог найти четкого, окончательного ответа, и я не уверен, что я могу сделать, чтобы получить веб-путь root в ConfigureServices.

Вариант использования

Хотя это не имеет прямого отношения к вопросу, я пытаюсь получить путь к моей конечной точке токена, чтобы я мог настройте свойство TokenUrl в новом OpenApiAuthFlow для службы Swashbuckle AddSwaggerGen. Я бы предпочел не указывать URL-адрес localhost, поскольку в конечном итоге он будет развернут на рабочем веб-сайте. Полагаю, я мог бы сохранить его в настройках приложения, если бы это было необходимо, но я надеялся, что мне не придется поддерживать там путь.

services.AddSwaggerGen(options =>
    {
        options.SwaggerDoc("v1", new OpenApiInfo {Title = "Protected API", Version = "v1"});
        options.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme
        {
            Type = SecuritySchemeType.OAuth2,
            Flows = new OpenApiOAuthFlows
            {
                AuthorizationCode = new OpenApiOAuthFlow
                {
                    AuthorizationUrl = new Uri("https://localhost:5000/connect/authorize"),
                    TokenUrl = new Uri("https://localhost:5000/connect/token"),
                    Scopes = new Dictionary<string, string>
                    {
                        {"api1", "Demo API - full access"}
                    }
                }
            }
        });
    });

1 Ответ

0 голосов
/ 09 июля 2020

Это не ошибка, а фича; вы просто не можете делать то, что хотите в ConfigureServices. Если вы хотите получить доступ к папке wwwroot, поместите свой код в метод Configure или в метод ServiceCollection, вы можете получить экземпляр IServiceProvider, например .AddTransient.

образец

services.AddTransient(p =>
{
    var environment = p.GetRequiredService<IWebHostEnvironment>();
    var path = environment.WebRootPath;
    return new Stuff(path);
});
...