首页 > 解决方案 > 需要在 Startup.cs 的 ConfigureServices 方法中获取站点 URL

问题描述

我正在使用 ASP.NET Core MVC 2.2,我需要在 Startup.cs 的 ConfigureServices 方法中获取网站的当前 URL。

这是因为 URL 被传递到我在该方法中配置的库的构造函数中。

services.AddScoped<IEmailProvider>(ep => new SendGridEmailProvider(Configuration["Email:SendGridApiKey"],
                Configuration.GetValue<bool>("Email:TestMode", true), 
                Configuration["Email:TestModeEmailAddresses"],
                Configuration["ENVIRONMENT"], 
                "THIS SHOULD BE THE APPLICATION URL"));

我很确定我不能在 ConfigureServices 中使用标准的依赖注入技术,因为这是实际设置所有依赖注入的地方!

有什么方法可以获取请求的当前 URL?我只需要像 www.site.com 这样的基本 URL。

标签: c#asp.net-coredependency-injection

解决方案


我对 ASP.Net 5 应用程序有类似的情况,@crgolden 提出的IHttpContextAccessor用于 Scoped 服务的解决方案工作得很好

我没有实现IConfigureOptions(当然是一个好方法,但对我的情况来说可能有点矫枉过正),我只是调用GetService<IHttpContextAccessor>()了实现工厂方法来获取服务的实例。

对于这种情况,它将是:

public void ConfigureServices(IServiceCollection services)
{
    // [...]

    services.AddHttpContextAccessor();

    services.AddScoped<IEmailProvider>(ep => new SendGridEmailProvider(Configuration["Email:SendGridApiKey"],
            Configuration.GetValue<bool>("Email:TestMode", true), 
            Configuration["Email:TestModeEmailAddresses"],
            Configuration["ENVIRONMENT"], 
            GetUrl(ep.GetService<IHttpContextAccessor>())));
}

public string GetUrl(IHttpContextAccessor ca)
{
    return ca.HttpContext.Request.Scheme + "://" + ca.HttpContext.Request.Host + ca.HttpContext.Request.PathBase;
}

推荐阅读