.Net Core 2.1-读取javascript文件中的appsettings.json
我在.NETCore2.1中有一个使用Signal的Web应用程序。我需要将HubUrl传递到自定义javascript文件中。这在.NETCore中可能吗 js代码示例:.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
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文件。我建议您的控制器拒绝(returnnull
)所有参数名,但您列出的参数名除外。在当前的实现中,如果将secret2
添加到配置中,但忘记更新此控制器代码,则会意外地公开新的机密值。