【问题标题】:Determine if ASP.Net Core webapp is running on localhost确定 ASP.Net Core webapp 是否在 localhost 上运行
【发布时间】:2020-03-10 16:42:25
【问题描述】:

在我的公司,开发人员机器位于代理后面。我有一个场景,我需要为它提供我的凭据,我通过 HttpClient.DefaultProxy 完成它。但是,在暂存和生产服务器上没有代理。我想做的是确定应用程序是否在本地主机上运行,​​并且只在这种情况下设置默认代理。在过去,我查看了 HttpRequest 以确定该信息。为此,我需要在启动文件中应用逻辑。

到目前为止,我想出的唯一干净的解决方案是检查附加的调试器。这并不理想,因为我们也在本地运行这些应用程序而没有附加调试器。 另一种选择是使用中间件,然后检查“localhost”的 url,但这似乎太过分了。

任何想法都将不胜感激!

public void ConfigureServices(IServiceCollection services)
{
   if (/*Some clean way to determine IsLocal*/)
   {
       //Need to provide proxy credentials for local development only
       var proxyCredentials = new NetworkCredential(Configuration["ProxyCredentials:Username"], Configuration["ProxyCredentials:Password"]);
       HttpClient.DefaultProxy = new WebProxy("http://proxy.company.com:80", false, null, proxyCredentials);
   }
}

澄清以防止问题被删除 - 我想确定是否存在 httprequest 之前的 localhost。


更新我选择使用 lauchSetting.json,它也不完美,但最适合我的情况。我会为将来处于同一职位的任何开发人员概述所有选项及其优缺点。

选项 1: 添加本地环境
问题: 如果您已经有特定于环境的配置,如果您想定位“暂存”,您将花时间复制粘贴配置" 来自您的“本地”配置文件。
代码

public void ConfigureServices(IServiceCollection services)
{
   if (HostingEnvironment.IsEnvironment("Local"))
   {
       //Need to provide proxy credentials for local development only
       var proxyCredentials = new NetworkCredential(Configuration["ProxyCredentials:Username"], Configuration["ProxyCredentials:Password"]);
       HttpClient.DefaultProxy = new WebProxy("http://proxy.company.com:80", false, null, proxyCredentials);
   }
}


选项 2: 创建一个中间件以检查请求 url 中的本地主机
问题:根据其实现方式,它可能会过于频繁地运行。如果您的本地版本未在 url 中使用 localhost,它也不起作用。

选项 3: 使用 launchSettings.json 来容纳 environmentVariable
问题: 根据您的 IDE,这可能不起作用。它假定您提交了您的 launchSettings.json 文件。
代码

{
   "profiles": {
      "IIS Express": {
         "commandName": "IISExpress",
         "launchBrowser": true,
         "environmentVariables": {
            "ASPNETCORE_ENVIRONMENT": "Development",
            "IsLocal": "True"
         }
      }
   }
}

public void ConfigureServices(IServiceCollection services)
{
   if (Environment.GetEnvironmentVariable("IsLocal") == "True")
   {
       //Need to provide proxy credentials for local development only
       var proxyCredentials = new NetworkCredential(Configuration["ProxyCredentials:Username"], Configuration["ProxyCredentials:Password"]);
       HttpClient.DefaultProxy = new WebProxy("http://proxy.company.com:80", false, null, proxyCredentials);
   }
}

选项 3.5: 使用实际的环境变量
问题:除了检查代码和运行之外,还需要额外的开发人员设置

选项 4: 使用机器名称来确定是开发者还是服务器
问题: 假设所有开发者机器都使用某种标准。
代码

public void ConfigureServices(IServiceCollection services)
{
   if (Environment.MachineName.StartsWith("DEV", StringComparison.OrdinalIgnoreCase))
   {
       //Need to provide proxy credentials for local development only
       var proxyCredentials = new NetworkCredential(Configuration["ProxyCredentials:Username"], Configuration["ProxyCredentials:Password"]);
       HttpClient.DefaultProxy = new WebProxy("http://proxy.company.com:80", false, null, proxyCredentials);
   }
}

选项 5: 检查附加的调试器
问题:当您在本地运行时,调试器并不总是附加
代码

public void ConfigureServices(IServiceCollection services)
{
   if (Debugger.IsAttached)
   {
       //Need to provide proxy credentials for local development only
       var proxyCredentials = new NetworkCredential(Configuration["ProxyCredentials:Username"], Configuration["ProxyCredentials:Password"]);
       HttpClient.DefaultProxy = new WebProxy("http://proxy.company.com:80", false, null, proxyCredentials);
   }
}

选项 6: 使用编译时调试检查
问题: 可能不想在每个场景中都在调试中编译
代码

#if(DEBUG)
       //Need to provide proxy credentials for local development only
       var proxyCredentials = new NetworkCredential(Configuration["ProxyCredentials:Username"], Configuration["ProxyCredentials:Password"]);
       HttpClient.DefaultProxy = new WebProxy("http://proxy.company.com:80", false, null, proxyCredentials);
#endif

【问题讨论】:

  • 我们说的是 ASP.NET Core 吗?
  • 如果只是为了开发,使用#if DEBUG或者if (hostEnvironment.IsDevelopment())怎么样?
  • @CodeStranger 是 .net 核心
  • 如果您 p​​ing 服务器名称,您将获得 IP 地址,这可能会有所帮助。然后与带有 localhost 的 ping 进行比较。问题可能是本地主机有时会根据机器的主机文件返回 127.0.0.1。
  • @KirkLarkin 不幸的是,我们实际上已经有了一个真正的非本地开发环境。我们还使用本地计算机上的环境配置来连接到正确的数据库/api 等,因此使用托管环境无法正常工作。如果 DEBUG 是我的后备方案,但并不理想,因为我们并不总是在本地运行调试

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


【解决方案1】:

我会使用您的 选项 4 的变体,并带有一个小的单行白名单

if("|PC1|PC2|PC3|".Contains("|" + Environment.MachineName + "|"))
{
    // proxy code here
}

...然后就完成了。

我认为这将是一个很好的务实解决方案。

记住:完美是善的敌人。

我不知道上下文,但如果您是在代码库的这个角落工作的主要开发人员,这将是一个非常好的解决方案,您只需通知您的同事是否/当他需要调试时,他需要将他的机器名称添加到列表中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 2010-10-16
    相关资源
    最近更新 更多