c# - 需要在 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。
解决方案
我对 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;
}
推荐阅读
- reactjs - Cypress_Test_Automation:如何为运行时创建的组件触发事件
- python - NDArray 的这种行为是否正确?
- docker - 从另一个容器访问一个容器的端口
- c# - 如何在 ASP.Net Core 中为唯一的电子邮件地址添加 IdentityUser IdentityResult 错误
- javascript - 需要在foreach循环中运行不同时区的实时时钟
- sql - 尝试插入表 A 并链接表 B 和 C,但如果不存在则添加到所有表
- swift - 收到警告消息
在 getter setter 方法中 - java - Java HTMLUnit WebClient ScriptException 错误
- angular - 如何在静态类中注入服务而不在 Angular 7 的子类中传递服务?
- regex - 环回 3 字符串与和条件不匹配