在获取应用程序的主机名/域名和端口时需要帮助。
到目前为止,这是我在Configure
内的Startup.cs
方法中的示例代码:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
var url = ""; // something that will get the current host/domain and port of the running applicaiton.
RecurringJob.AddOrUpdate<ISomething>(i=>i.SomethingToExecute(url), Cron.Daily);
}
因为我需要将url
字符串传递给我的SomethingToExecute
方法
public class Something : ISomething
{
public void SomethingToExecute(string url){
...
Debug.WriteLine(url)
}
}
答案 0 :(得分:4)
根据此Github Issue和ASP.NET Core团队的答复:
不可能。您需要直接从config读取此信息。在准备启动应用程序(启动后)之前,服务器不会读取端点配置。即使那样,由于反向代理设置(例如IIS,Nginx,泊坞窗等),该信息在很多时候还是不准确的。
答案 1 :(得分:1)
正如TanvirArjel已经提到的那样,这似乎是不可能的。但是,根据您的情况,您可以在代码正文中动态获取主机名。
(在.Net Core 2.1中测试)
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddSingleton<something>();
}
something.cs
public class something
{
public string url;
public string SomethingToExecute()
{
return url;
}
}
控制器
[ApiController]
public class HomeController : ControllerBase
{
private something _sth;
public HomeController(something sth)
{
_sth = sth;
}
[HttpGet("foo")]
public string foo()
{
_sth.url = Request.Scheme + "://" + Request.Host;
return _sth.SomethingToExecute();
}
}
答案 2 :(得分:1)
似乎不可能,但是或者,如果您想使用C#代码调用HTTP请求或Web API,则可以使用HttpClient()
您可以做的就是结合@TanvirArjel所说的内容,并使用HttpClient()
来调用HTTP请求。
appsettings.json
在您的SomethingToExecute()
中使用类似这样的内容。
private readonly IConfiguration configuration;
public ISomething(IConfiguration configuration){
this.configuration = configuration;
}
public void SomethingToExecute(){
var httpClient = new HttpClient();
var yourHostNameAndPort = configuration["NameFromYourAppSEttingsJsonFile"];
httpClient.Get("" + yourHostNameAndPort + "...);
}
我希望它也能帮助其他人。
答案 3 :(得分:0)
对于主机名-您可以使用Dns.GetHostName()在控制器内轻松获取它。 还有另一种方法是从HttpRequestContext获取它,例如 Startup.cs => ConfigureServices => services.AddHttpContextAccessor();
Controler => ctor =>使用IHttpContextAccessor 然后在控制器方法中
HttpContextAccessor.HttpContext.Request.Host.Host HttpContextAccessor.HttpContext.Request.Host.Port
但是,HttpRequetsContext信息不是很可靠。
这里已经讨论了获取主机和端口的最佳方法: Determine port Kestrel binded to
答案 4 :(得分:0)
这个替代选项可能很有用,在 appsettings.{Environment}.json 中设置主机名并通过 IConfiguration 获取值:
private readonly IConfiguration _configuration;
public Startup(IConfiguration configuration){
_configuration = configuration;
}
public void ConfigureServices(IServiceCollection services)
{
var host = _configuration.GetSection("Host").Get<string>();
}