Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Configuration 在.NET核心web应用程序的客户端上访问应用程序范围设置的策略_Configuration_Asp.net Core_Asp.net Core Mvc - Fatal编程技术网

Configuration 在.NET核心web应用程序的客户端上访问应用程序范围设置的策略

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",

我们正在使用ASP.NET内核重新编写一个应用程序。我们正在尝试的体系结构有一个Web API,它运行在与演示不同的URL上。当然,这个API的根URL在不同的环境中会发生变化,所以我试图弄清楚如何在JavaScript中设置配置和访问Web API根URL,以便检索数据。例如,假设我有一个AJAX调用来从API获取一些数据:

$.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(或创建一个新模型,该模型将封装选项和原始模型)