有人可以演示如何在 ASP.NET Core 中成功声明依赖于主机名的静态项目变量吗?
以前我有类似于下面的代码,使用 Global.asax 来识别运行项目的主机名,并设置一些简单的静态变量,整个项目可以像这样使用“MvcApplication.Colour”
public static string Colour;
public static string ConnectionString;
public static string HostName = System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName().ToLower();
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
ProjectSettings();
}
public static void ProjectSettings()
{
switch (HostName)
{
case "external-domain":
ConnectionString = WebConfigurationManager.ConnectionStrings["External"].ToString();
Colour = "blue";
break;
case "internal-domain":
ConnectionString = WebConfigurationManager.ConnectionStrings["Internal"].ToString();
Colour = "purple";
break;
default:
ConnectionString = WebConfigurationManager.ConnectionStrings["Test"].ToString();
Colour = "red";
break;
}
}
我见过将 AppSetting 传递给 HomeController 的示例,例如:
public class HomeController : Controller
{
private readonly Startup.AppSettings _appSettings;
public HomeController(IOptions<Startup.AppSettings> appSettings)
{
_appSettings = appSettings.Value;
}
public IActionResult Index()
{
var colour = _appSettings.Colour;
return View();
}
public IActionResult Error()
{
return View();
}
}
还看到了注入(inject)示例,直接在 ASP.NET Core MVC 应用程序中的 Razor View 中使用 AppSettings,如下所示:
@using Microsoft.Extensions.Options
@{
@inject IOptions<Startup.AppSettings> OptionsAppSettings
@OptionsAppSettings.Value.Colour;
}
有没有类似于 Global.asax 的更简单的方法而不必在每个 Controller 或每个 View 中重新声明?
我遇到的最困难的工作是如何在 Startup.cs 中获取主机名,它似乎只有在事件发生后才可用,也许可以在 Controller 级别之前获取和设置这些变量。
任何帮助将非常感激 :-)
最佳答案
通过更多的坚持和研究,我想出了如何将我以前的 MVC5 Global.asax
迁移到 ASP.NET Core Startup.cs
。您将在下面看到实现 Host 确定的 AppSettings 的所有相关代码。
appsettings.json
{
"ConnectionStrings": {
"External": "Data Source=externalserver;Initial Catalog=externaldatabase;Persist Security Info=True;User ID=externalid;Password=externalpassword",
"Internal": "Data Source=internalserver;Initial Catalog=internaldatabase;Persist Security Info=True;User ID=internalid;Password=internalpassword",
"Test": "Data Source=testserver;Initial Catalog=testdatabase;Persist Security Info=True;User ID=testid;Password=testpassword"
},
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information"
}
}
}
AppSettings.cs namespace WebApplication1
{
public class AppSettings
{
public string Colour;
public string ConnectionString;
}
}
Startup.cs using System;
using System.Net;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
namespace WebApplication1
{
public class Startup
{
public AppSettings AppSettings;
public static string Colour;
public static string External;
public static string HostName;
public static string Internal;
public static string Test;
public Startup(IHostingEnvironment hostingEnvironment)
{
var configurationBuilder = new ConfigurationBuilder().SetBasePath(hostingEnvironment.ContentRootPath).AddJsonFile("appsettings.json", true, true).AddJsonFile($"appsettings.{hostingEnvironment.EnvironmentName}.json", true).AddEnvironmentVariables();
Configuration = configurationBuilder.Build();
External = Configuration.GetConnectionString("External");
Internal = Configuration.GetConnectionString("Internal");
Test = Configuration.GetConnectionString("Test");
}
public IConfigurationRoot Configuration { get; }
public void ConfigureServices(IServiceCollection serviceCollection)
{
serviceCollection.AddMvc();
serviceCollection.Configure<AppSettings>(appSettings =>
{
HostName = Dns.GetHostName().ToLower();
switch (HostName)
{
case "external-domain":
appSettings.ConnectionString = External;
appSettings.Colour = "blue";
break;
case "internal-domain":
appSettings.ConnectionString = Internal;
appSettings.Colour = "purple";
break;
default:
appSettings.ConnectionString = Test;
appSettings.Colour = "red";
break;
}
});
}
public void Configure(IApplicationBuilder applicationBuilder, IHostingEnvironment hostingEnvironment, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
if (hostingEnvironment.IsDevelopment())
{
applicationBuilder.UseDeveloperExceptionPage();
applicationBuilder.UseBrowserLink();
}
else {
applicationBuilder.UseExceptionHandler("/Home/Error");
}
applicationBuilder.UseStaticFiles();
applicationBuilder.UseMvc(routes =>
{
routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");
});
}
}
}
HomeController.cs using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
namespace WebApplication1.Controllers
{
public class HomeController : Controller
{
private readonly AppSettings _appSettings;
public HomeController(IOptions<AppSettings> appSettings)
{
_appSettings = appSettings.Value;
}
public IActionResult Index()
{
var colour = _appSettings.Colour;
return View();
}
public IActionResult Error()
{
return View();
}
}
}
在 View 中,您可以像这样使用依赖注入(inject):@using Microsoft.Extensions.Options
@{
@inject IOptions<AppSettings> OptionsAppSettings
@OptionsAppSettings.Value.Colour;
}
我希望这对其他人有用:-)关于c# - 如何将 C# MVC5 Global.asax 迁移到 ASP.NET Core Startup.cs,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45417665/