首页 > 解决方案 > 托管 Blazor 的 ConfigureServices 中的空 WebRootPath

问题描述

我想从Blazor.Server.Startup.ConfigureServicesBlazor 托管解决方案中访问 Web 根路径。

我已注入IWebHostEnvironment构造Startup函数并将其保存为名为“WebHostEnvironment”的属性。问题是在 ConfigureServices 中,WebHostEnvironment.WebRootPath始终为空。

我已经验证了:

这似乎是一个常见问题(也许 WebRootPath 仅在某些条件下填充 - 例如在我的应用程序发布/部署之后?),但是我无法在任何地方找到明确、明确的答案,我不确定是什么我可以在ConfigureServices.

用例

虽然与问题没有直接关系,但我正在尝试获取到我的令牌端点的路径,以便我可以TokenUrl在新OpenApiAuthFlow的 SwashbuckleAddSwaggerGen服务中配置该属性。我宁愿不必指定 localhost URL,因为它最终将部署到生产网站。我想如果需要我可以将它存储在 appsettings 中,但我希望不必在那里维护路径。

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"}
                    }
                }
            }
        });
    });

标签: c#asp.net-coreblazor

解决方案


这不是一个错误,而是一个特性;你只是不能做你想做的事ConfigureServices
如果您想访问wwwroot文件夹,请将您的代码放入Configure方法或方法中,ServiceCollection您可以获得一个IServiceProvider实例,例如.AddTransient.

样本

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

推荐阅读