在“配置Startup.cs”中获取域名或主机名和端口

时间:2019-03-27 03:36:24

标签: c# asp.net asp.net-core asp.net-core-2.0 asp.net-core-2.1

在获取应用程序的主机名/域名和端口时需要帮助。

到目前为止,这是我在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)
    }
}

5 个答案:

答案 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请求。

  1. 将主机名存储在appsettings.json
  2. 在您的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>();
}