C# 如何在应用程序启动时获取请求URL

C# 如何在应用程序启动时获取请求URL,c#,asp.net-core,asp.net-core-mvc,C#,Asp.net Core,Asp.net Core Mvc,我试图在应用程序启动时在我的Startup.cs文件中找到请求URL(特别是域) public Startup(IHostingEnvironment env) { Configuration = new Configuration().AddEnvironmentVariables(); string url = ""; } 我在Startup.cs文件中需要它,因为它将确定稍后在Startup类的ConfigureServices方法中添加哪些临时服务 获取此信息的正确方法是什

我试图在应用程序启动时在我的Startup.cs文件中找到请求URL(特别是域)

public Startup(IHostingEnvironment env)
{
   Configuration = new Configuration().AddEnvironmentVariables();
   string url = "";
}
我在Startup.cs文件中需要它,因为它将确定稍后在Startup类的ConfigureServices方法中添加哪些临时服务


获取此信息的正确方法是什么?

很遗憾,您无法检索应用程序的托管URL,因为该位由IIS/WebListener等控制,并且不会直接流到应用程序

现在,一个很好的替代方法是为每个服务器提供一个
ASPNET\u ENV
环境变量,然后分离逻辑。下面是一些关于如何使用它的示例:

Startup.cs:

public class Startup
{
    public void Configure(IApplicationBuilder app)
    {
        // Will only get called if there's no method that is named Configure{ASPNET_ENV}.
    }

    public void ConfigureDev(IApplicationBuilder app)
    {
        // Will get called when ASPNET_ENV=Dev
    }
}
public class Startup
{
    public void Configure(IApplicationBuilder app)
    {
        // Wont get called.
    }

    public void ConfigureDev(IApplicationBuilder app)
    {
        // Wont get called
    }
}

下面是另一个例子,当ASPNET_ENV=Dev时,我们希望进行类分离而不是方法分离:

Startup.cs:

public class Startup
{
    public void Configure(IApplicationBuilder app)
    {
        // Will only get called if there's no method that is named Configure{ASPNET_ENV}.
    }

    public void ConfigureDev(IApplicationBuilder app)
    {
        // Will get called when ASPNET_ENV=Dev
    }
}
public class Startup
{
    public void Configure(IApplicationBuilder app)
    {
        // Wont get called.
    }

    public void ConfigureDev(IApplicationBuilder app)
    {
        // Wont get called
    }
}
StartupDev.cs

public class StartupDev // Note the "Dev" suffix
{
    public void Configure(IApplicationBuilder app)
    {
        // Would only get called if ConfigureDev didn't exist.
    }

    public void ConfigureDev(IApplicationBuilder app)
    {
        // Will get called.
    }
}

希望这有帮助。

这不会给您提供域,但如果您只是在一个端口上运行,并且需要访问该端口,则可能会有所帮助:

        var url = app.ServerFeatures.Get<Microsoft.AspNetCore.Hosting.Server.Features.IServerAddressesFeature>().Addresses.Single();
var url=app.ServerFeatures.Get().Addresses.Single();

不确定如果绑定了多个地址会发生什么情况。

谢谢您的回答。这是有帮助的(尽管令人失望),但是我决定为我的问题采取另一种方法。或者坚持使用一种
Configure
方法,只需使用一个很好的旧if语句检查
env.EnvironmentName
的值。关于这一点,请记住,对于Azure(我不仅想象),本地信息是检索到的,不是外部可用的域。@Simon_Weaver它在asp.net core 2.xx中不再工作。正在努力以其他方式获取托管url。我希望获得kestra或IIS的托管url(即,在dev上,它将类似于和prod,它将是我们设置的任何域,IISIntegration将设置该url)@Nexus23我对core做的很少,但当我面对这个问题时,我认为我必须“欺骗”并在配置中输入外部域,这样它才能读取配置本身。我相信还有一种更聪明的方法。@Simon_Weaver你能分享一下这个骗局吗,如果现在还有效的话,我可以接受:)这不起作用,总是一样的结果:启动127.0.0.1:XXX