【问题标题】:Different url based on development environment with C# MVC基于 C# MVC 开发环境的不同 url
【发布时间】:2018-03-29 16:43:42
【问题描述】:

我有两个 MVC Web 应用程序,一个 www.company.com 和一个 solution.company.com

网站 www.company.com 包含指向 solution.company.com/Contact 的链接,但我如何在视图中设置 href 以便能够在开发/预生产/生产环境中对其进行测试?

开发人员:

<a href="http://localhost:88/Contact/">Contact Us</a> 

质量检查:

<a href="http://qa.solution.company.com/Contact/">Contact Us</a> 

珠三角:

<a href="http://solution.company.com/Contact/">Contact Us</a> 

【问题讨论】:

  • 是在您运行 Web 应用程序的同一个网站中“联系我们”还是外部网站?
  • 您好,它在不同的 Web 应用程序(网站)中,但在同一个解决方案中。
  • 您只需要使用Url 帮助器并让MVC 为您生成URL。像&lt;a href="@Url.Action("Index", "Contact")"&gt;Contact Us&lt;/a&gt; 这样的东西就是你所需要的。 MVC 将确保使用正确的主机名。
  • 你使用的是什么版本的 MVC?
  • @BrendanGreen 嗨,该操作在另一个 Web 应用程序中

标签: c# asp.net-mvc


【解决方案1】:

您可以使用 web.config 设置不同的变量。为每个环境使用单独的 web.config。例如。 web.release 和 web.debug。同样的方式你可以使用。每个环境的单独文件

如果你使用,八达通部署。使用也可以在章鱼变量中设置。

<appSettings>
  <add key="MyVariable1" value="False" />
  <add key="MyName" value="akshay bheda" />
</appSetting>

现在您可以从 C# 代码中轻松访问此变量及其值:

string myVariable = System.Configuration.ConfigurationSettings.AppSettings["MyName"];

现在你可以使用这个字符串来代替在那里写 url。

<a href="<%= ConfigurationManager.AppSettings["someKey"] %>">

如果您不想使用 Octopus Deployment,您可以按照以下步骤操作。

1.) 从配置管理器创建新配置。它位于构建菜单下。 并创建一个新配置,例如。生产 并选择从 Debug 或任何其他现有 web.config 复制设置,这样您就不必再次编写。

2.) 创建新配置后,右键单击 Web.config 并单击添加配置转换 之后,您将找到新配置的 web.config。

在每个配置的 appSettings 部分中进行更改,并在启动项目时选择您的构建配置。

它将从相应配置的 appSettings 部分获取配置设置。

【讨论】:

  • 您好,谢谢!你能分享一个简单的例子来说明我如何做到这一点吗?
  • 您可以使用八达通部署。并且在章鱼变量中,您可以根据不同的环境为同一键设置不同的值。根据环境,将使用章鱼中设置的值。
  • @Patrick - 您不需要 Octopus 或任何特殊添加到您的项目中。您可以使用 Web Config Transformations (c-sharpcorner.com/UploadFile/amit12345/…) 使您的 web.config 根据您的构建配置(调试、发布等)具有不同的应用程序设置值。您可以使用这些来更改 URL,具体取决于您要部署到的位置。
  • @Patrick 看到这个,我已经添加了更多内容,希望这能满足你的问题
  • @AkshayBheda 感谢您的帮助。我已将您的答案标记为正确,因为它似乎是管理和实施的最佳答案。
【解决方案2】:

您无需为此使用应用设置。只需使用 MVC 中的 URLHelper 即可确保使用正确的主机名。

所以不要这样:

<a href="http://solution.company.com/Contact/">Contact Us</a> 

你这样做:

<a href="@Url.Action("Index", "Contact")">Contact Us</a>

这将生成一个链接,指向IndexController 中的Contact 操作。

另一种选择是使用HTMLHelper 扩展方法为您生成整个标签。在这种情况下,你会这样做:

@Html.ActionLink("Index", "Contact", "Contact Us")

【讨论】:

  • 这行不通。他希望超链接解析到不同的主机。
  • 啊错过了那一点。
  • 他们有不同的解决方案
【解决方案3】:

根据您在现有答案中看到的内容,您需要更改静态字符串 hrefs 以获取在编译时定义的内容。我认为你应该按照前面的建议,为Web.Debug.configWeb.Release.config写不同的标签,但不是为了解决你的具体情况,主要是为了定义你的连接字符串,以防你每个基地都有不同的数据库源。

要解决您的具体情况,只需使用 Url 原生 MVC 帮助程序,并将您的静态 href 替换为 &lt;a href="@Url.Content("~/Contact")"&gt; Contact &lt;/a&gt; 之类的东西,其中 "~/" 代表您的域根,无论它是哪一个。

另外,鉴于您没有在“Contact”之前写任何控制器名称,我假设您的应用程序中有一个 ContactController,并且正在使用此地址访问其索引视图。

【讨论】:

    【解决方案4】:

    如果您为 MVC 视图创建了一个模型,或者为返回的模型添加了一个设置字典并简单地从控制器返回数据,该怎么办?

    <a href="@Model["ContactUsUrl"]">Contact Us</a>
    

    <a href="@Model.Settings["ContactUsUrl"]">Contact Us</a>
    

    或者,您可以只使用具有 ContactUsUrl 属性的模型

    <a href="@Model.ContactUsUrl">Contact Us</a>
    

    然后在您的控制器代码中,您可以使用任何您想要确定它是 DEV、QA 还是 PROD 的逻辑,并从关联的源中提取 URL 的数据,例如一个数据库,一个配置文件,一个自定义设置文件。这抽象了逻辑并简化了数据在页面上的使用方式。

    这是直接使用 web.config 的替代方法。

    【讨论】:

      【解决方案5】:

      如果由于某种原因您没有自动部署系统来指定每个环境变量(如之前答案中提到的 Octopus),还有其他几个选项。

      1:将您的设置放入每个环境的machine.config 文件中,并将该配置部署到相应的服务器。

      2:将您的关系放入配置文件中:

        <appSettings>
          <add key="contact-for-localhost" value="http://localhost:88/Contact/" />
          <add key="contact-for-qa.company.com" value="http://qa.solution.company.com/Contact/" />
          <add key="contact-for-www.company.com" value="http://solution.company.com/Contact/" />
          <add key="contact-for-company.com" value="http://solution.company.com/Contact/" />
        </appSettings>
      

      然后在控制器中按主机名询问设置:

      var contactLink = ConfigurationManager.AppSettings[$"contact-for{Request.Url.Host}"]
      

      并将其传递给您的模型。

      由于您没有不同的配置可以切换,要测试这种方法,您可以将主机文件 (c:\System32\drivers\etc\hosts) 更改为假冒每个环境

      127.0.0.1  localhost
      127.0.0.1  qa.company.com
      127.0.0.1  company.com
      127.0.0.1  www.company.com
      

      然后注释掉或删除非本地主机条目以连接到真实服务器。

      【讨论】:

        【解决方案6】:

        提出的解决方案很好,但只是切换一个网址恕我直言会产生很多开销。

        我会采用环境变量的方法并相应地设置网址。

        Contact.cshtml

        @{
            var env = Environment.GetEnvironmentVariable("MY_APP_ENV");
            var url = env == "prod" ? "http://qa.solution.company.com/Contact/" :
                      env == "qa"   ? "http://solution.company.com/Contact/" :
                                      "http://localhost:88/contact/";
        }
        
        <a href="@url">Contact Us</a>
        

        如果这是一个大项目并且您可以投入一些时间,我会将其放在每个环境的 appSettingsset up parameters.xml 中,并在部署期间使用它。

        【讨论】:

          【解决方案7】:

          如果你想使用 DotNet Core 或者想切换到它,那么最好实现它的环境配置能力。

          官网文档:Working with multiple environmentsConfiguration in ASP.NET Core

          Here 就是一个很好的例子。

          var builder = new ConfigurationBuilder()
              SetBasePath(hostEnv.ContentRootPath)
              .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
              .AddJsonFile($"appsettings.{hostEnv.EnvironmentName}.json", optional: true, reloadOnChange: true);
          

          您只需要定义 3 个不同的 appsettings 文件。并在您的系统中设置ASPNETCORE_ENVIRONMENT,您可以在那里进行测试或开发。

          或者您可以使用env.IsEnvironment("environmentname") 在运行时检查某些内容。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-12-12
            • 1970-01-01
            • 1970-01-01
            • 2018-03-10
            • 2020-11-16
            • 1970-01-01
            相关资源
            最近更新 更多