Configuration 在.NET核心web应用程序的客户端上访问应用程序范围设置的策略
我们正在使用ASP.NET内核重新编写一个应用程序。我们正在尝试的体系结构有一个Web API,它运行在与演示不同的URL上。当然,这个API的根URL在不同的环境中会发生变化,所以我试图弄清楚如何在JavaScript中设置配置和访问Web API根URL,以便检索数据。例如,假设我有一个AJAX调用来从API获取一些数据:Configuration 在.NET核心web应用程序的客户端上访问应用程序范围设置的策略,configuration,asp.net-core,asp.net-core-mvc,Configuration,Asp.net Core,Asp.net Core Mvc,我们正在使用ASP.NET内核重新编写一个应用程序。我们正在尝试的体系结构有一个Web API,它运行在与演示不同的URL上。当然,这个API的根URL在不同的环境中会发生变化,所以我试图弄清楚如何在JavaScript中设置配置和访问Web API根URL,以便检索数据。例如,假设我有一个AJAX调用来从API获取一些数据: $.ajax({ dataType: "json", url: "http://this.url.will.change/api/whatever",
$.ajax({
dataType: "json",
url: "http://this.url.will.change/api/whatever", //this will change!
success: function(response) {
//load the items
}
});
我已经为各种构建/部署场景设置了appsettings.json
文件,并让它们很好地读取和注入,因此我可以将URL存储在那里
{
"Data": {
"DefaultConnection": {
"ConnectionString": "whatever"
}
},
"AppSettings": {
"ApiRootUrl": "http://apiroot/api/"
}
}
我考虑编写一个
UrlHelper
扩展来提供Web API根,但我认为没有办法将IOptions
对象注入到静态扩展方法中。所以,我的问题是:如何使配置设置在我的CSHTML和JavaScript中全局可用?如下更新Startup.cs
public class Startup {
public IConfigurationRoot Configuration { get; set; }
public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv) {
IConfigurationBuilder builder = new ConfigurationBuilder()
.SetBasePath(appEnv.ApplicationBasePath)
.AddJsonFile("appsettings.json");
Configuration = builder.Build();
}
public void ConfigureServices(IServiceCollection services) {
services.AddSingleton(_ => Configuration);
}
}
然后在您的控制器上,您可以像这样注入配置
public class ConfigurationController : Controller {
private readonly IConfigurationRoot config;
public ConfigurationController (IConfigurationRoot config) {
this.config = config;
}
public string Test() {
return config.Get<string>("AppSettings:ApiRootUrl");
}
}
公共类配置控制器:控制器{
私有只读IConfigurationRoot配置;
公共配置控制器(IConfigurationRoot配置){
this.config=config;
}
公共字符串测试(){
返回config.Get(“AppSettings:ApiRootUrl”);
}
}
我们曾经创建过一个特殊的配置控制器,负责根据所选配置设置创建动态javascript文件。您可以将IOption注入控制器。然后,通过这些选项,您可以构造一个新的自定义配置对象,该对象将只包含要公开的属性(您可能不想向数据库公开任何类似于连接字符串的内容)。
使用json库(如json.net)将此自定义配置对象序列化为json字符串,并从中创建文件内容,如
string fileContent = "var globalConf =" + JsonConvert.SerializeObject(configObject);
将字符串转换为字节数组,并将其作为FileContentResult
返回。
我们还设置了一些缓存头,以便浏览器不会每次都命中控制器并使用缓存
当然,您需要设置路由,因为对特定URL的调用将命中您的控制器并返回您动态创建的javascript文件。您可以使用常用的脚本标记在网站上引用它
至于服务器端渲染,您可以始终在模型中包含IOption(或创建一个新模型,该模型将封装选项和原始模型)