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
.Net Core 2.1-读取javascript文件中的appsettings.json_Javascript_Asp.net Core_.net Core_Asp.net Core Mvc_Signalr - Fatal编程技术网

.Net Core 2.1-读取javascript文件中的appsettings.json

.Net Core 2.1-读取javascript文件中的appsettings.json,javascript,asp.net-core,.net-core,asp.net-core-mvc,signalr,Javascript,Asp.net Core,.net Core,Asp.net Core Mvc,Signalr,我在.NETCore2.1中有一个使用Signal的Web应用程序。我需要将HubUrl传递到自定义javascript文件中。这在.NETCore中可能吗 js代码示例: const connection = new signalR.HubConnectionBuilder() .withUrl('http://localhost:5000/hub') //Here I need to read appSettings.json to get value from there .configu

我在.NETCore2.1中有一个使用Signal的Web应用程序。我需要将HubUrl传递到自定义javascript文件中。这在.NETCore中可能吗

js代码示例:

const connection = new signalR.HubConnectionBuilder()
.withUrl('http://localhost:5000/hub') //Here I need to read appSettings.json to get value from there
.configureLogging(signalR.LogLevel.Information)
.build();

appsettings.json位于服务器上。所以您需要将端点添加到返回所需值的控制器

控制器:

public class MyController:Controller{
    private readonly IConfiguration configuration;

    public MyController(IConfiguration configuration){
         this.configuration = configuration;
    }

    [HTTPGet]
    public ActionResult GetConfigurationValue(string sectionName, string paramName){
        var parameterValue= configuration[$"{sectionName}:{paramName}"];
        return Json(new { parameter= parameterValue});
    }
}
客户端:

$.ajax({
    type:"GET",
    url: "/MyController/GetConfigurationValue"
    data:{
        sectionName = "MySection",
        paramName = "MyParameter"
    }
}).done(
    function(parameterValue){
        //do what you need
});
在appsettings.json中:

{
    "MySection":{
        "MyParameter":"value that I want to get"
    }
}

一种非常安全但灵活的方法是在视图中的
块中公开URL。这样,您就不会公开应用程序配置(您必须很好地保护该访问),而是显式地公开单个安全值

它还有一个额外的好处,即您不需要向端点发出请求(您实际上还需要在脚本中知道该端点的地址),但在需要时,它会立即提供该值

为此,只需呈现一个定义全局值的
标记。例如,布局中可以包含以下内容:


window._signalradress=@Json.Serialize(ViewData[“signalradress]”);

然后您只需使用
窗口。_signalradress
在脚本内部。

在带有webpack的SPA中,您只需导入appsettings.json,并通过导入的便利类使其可用

e、 g

appsettings.js:

appsettingsjson = process.env.NODE_ENV === 'development'
    ? require('./appsettings.Development.json')
    : require('./appsettings.json');

class AppConfig {

    constructor() {
    }

    static Settings() {
        return appsettingsjson;
    }
}

module.exports = AppConfig;
然后,无论您在哪里需要它,只需导入和使用它。e、 g:

const AppConfig = require("./appsettings");
console.log(AppConfig.Settings().YourSection.YourParameter)
尊重“Maxemelian”的答案,通过添加验证案例来扩展答案

  • 如果节名称为空
  • 无视秘密
  • 专用只读IConfiguration配置;
    公共MyController(IConfiguration配置){
    this.configuration=配置;
    }
    [HttpGet(“[action]”)
    public ActionResult GetConfigurationValue(string sectionName、string paramName)
    {
    if(paramName.ToLower().Contains(“secret”)){
    返回null;
    }
    var parameterValue=(!string.IsNullOrEmpty(sectionName))?配置[$”{sectionName}:{paramName}]:配置[$”{paramName}];
    返回Json(新的{parameter=parameterValue});
    }
    
    appsettings.json中的

    "ApiUrls": {
        "commonUrl": "https://localhost:44348/api/"    
      }
    
    \u Layout.cshtml

    @using Microsoft.Extensions.Configuration
    @inject IConfiguration Configuration
    
    <script>      
            const commonUrl = @Json.Serialize(@Configuration.GetSection("ApiUrls").GetSection("commonUrl").Value)
    </script>
    
    使用Microsoft.Extensions.Configuration @注入I配置配置 const commonUrl=@Json.Serialize(@Configuration.GetSection(“apirls”).GetSection(“commonUrl”).Value)

    现在,如果您使用javascript内部视图,并且使用razor之类的视图引擎,那么这就像一个可访问所有js文件的全局变量。你可以查看那篇文章寻求解决办法。@maximelian1986问题是我只是在我的视图中引用了这个Js文件,就像
    工作得很有魅力一样。非常感谢。请注意,此实现非常危险,因为它允许任何人读取任何配置值,包括连接字符串或其他内部值等机密。如果希望端点返回配置值,则应将其限制为很少的显式值和/或进行非常强的输入验证,以防止人们访问关键信息。每次读取设置值时,此操作都会命中控制器。尝试将所有配置值作为列表提取。确保您的机密得到管理。@Kurkula,不,此实现只运行一次。它对控制器进行AJAX调用,然后在AJAX调用完成时执行一个函数,该函数的值可能是
    parameterValue
    。但是,我同意您的看法,控制器的实现最好是将所有需要的配置值作为一个列表拉出来,这样每个页面视图只需点击控制器一次。在其当前形式中,当您需要多个配置值时,AJAX调用是不可重用的,但这不是OP的问题。我相信这是一个更好的解决方案。我在我的几个web应用程序中使用了这种方法。然而,我最近遇到了一个障碍,即使用内容安全策略(CSP)有效地将可由浏览器执行的脚本列入白名单。有了CSP脚本策略,我需要添加
    'safe-inline'
    作为例外,有效地允许执行任何内联脚本,包括可能被恶意注入的脚本。(因此,该政策被命名为“不安全”)。如果你开始采用CSP,那就要小心了@但BlairAllen确实适用于任何类型的内联脚本。或者,您也可以有一个控制器操作,例如返回一个动态呈现的JavaScript文件。我建议您的控制器拒绝(return
    null
    )所有参数名,但您列出的参数名除外。在当前的实现中,如果将
    secret2
    添加到配置中,但忘记更新此控制器代码,则会意外地公开新的机密值。