4 votes

.Net Core 2.1 - Lire appsettings.json dans un fichier javascript

J'ai une application Web en .net Core 2.1 utilisant signalR. J'ai besoin de passer HubUrl dans un fichier javascript personnalisé. Est-ce possible en .net Core ?

Exemple de code 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();

8voto

maximelian1986 Points 952

Appsettings.json situé sur le serveur. Vous devez donc ajouter un end-point au contrôleur qui renvoie la valeur nécessaire.

Contrôleur :

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});
    }
}

Côté client :

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

Dans appsettings.json :

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

4voto

tejas n Points 99

Sur appsettings.json

"ApiUrls": {
    "commonUrl": "https://localhost:44348/api/"    
  }

Sur _Layout.cshtml

@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration

<script>      
        const commonUrl = @Json.Serialize(@Configuration.GetSection("ApiUrls").GetSection("commonUrl").Value)
</script>

maintenant ce sera comme une variable globale accessible à tous les fichiers js

3voto

poke Points 64398

Une façon très sûre et flexible de le faire est d'exposer l'URL à l'intérieur d'une balise <script> dans une vue. De cette façon, vous n'exposez pas la configuration de l'application (dont l'accès devra être très bien protégé) mais vous exposez explicitement une seule valeur sécurisée.

Il présente également l'avantage supplémentaire de ne pas devoir faire une demande à un point de terminaison (adresse que vous devez en fait également connaître dans votre script) mais de disposer instantanément de la valeur lorsque vous en avez besoin.

Pour ce faire, vous pouvez simplement rendre une <script> qui définit la valeur de manière globale. Par exemple, vous pourriez avoir ce qui suit dans votre mise en page :

<script>
window._signalRAddress = @Json.Serialize(ViewData["SignalRAddress"]);
</script>
<script src="~/your-custom-script.js"></script>

Et ensuite vous utilisez juste window._signalRAddress à l'intérieur de votre script.

1voto

Mark Zhukovsky Points 88

Dans un SPA avec webpack, vous pouvez simplement importer le fichier appsettings.json et le rendre disponible via une classe de commodité que vous importez ;

par exemple

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;

Ensuite, partout où vous en avez besoin, il suffit de l'importer et de l'utiliser, par exemple :

const AppConfig = require("./appsettings");
console.log(AppConfig.Settings().YourSection.YourParameter)

0voto

Chandana Points 593

En respectant la réponse de "Maxemelian", en étendant la réponse en ajoutant des cas de validation pour vérifier

  1. Si le nom de la section est nul
  2. Ignorer le secret

    private readonly IConfiguration configuration;

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

    [HttpGet("[action]")] public ActionResult GetConfigurationValue(string sectionName, string paramName) { if (paramName.ToLower().Contains("secret")) { return null; }

    var parameterValue = (!string.IsNullOrEmpty(sectionName)) ? config[$"{sectionName}:{paramName}"] : config[$"{paramName}"];
    return Json(new { parameter = parameterValue });

    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X