Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Microsoft Azure Discussion :

Function apps avertissement


Sujet :

Microsoft Azure

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    mai 2011
    Messages
    670
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : mai 2011
    Messages : 670
    Points : 92
    Points
    92
    Par défaut Function apps avertissement
    Bonjour,

    Pour ceux qui ont un abonnement Azure ,
    si vous developpez dans les Function App ,
    c'est pour avertir que la directive c# 'lock' ne fonctionnera pas .
    Otez plutot pour une machine virtuelle.

    En tout cas ca ne marche pas pour les httptrigger
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequestMessage req, TraceWriter log)
            {
    }
     
    {
    lock (lockcache)
                {
    //portion de code
    }
    Aussi c'est pour vous dire que dans Azure Emulator , cette directive fonctionne !


    Vous êtes prevenues !

    Merci de faire passer le message !

    Pour moi j'ai perdu 4 jours de boulot !

    Conclusion :
    Function app fonctionne mais pas la directive 'lock' de dotnet ! au moins dans httptrigger.



    Pardon j'ai la preuve ici que le lock se comporte mal !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
     public static class FTest
        {
            static object testlock = new object();
            [FunctionName("FTest")]
            public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequestMessage req, TraceWriter log)
            {
                string name;
                lock (testlock)
                {
     
                    log.Info("C# HTTP trigger function processed a request BEGIN.");
                    Thread.Sleep(8000);
                    // parse query parameter
                    //name = req.GetQueryNameValuePairs()
                    //    .FirstOrDefault(q => string.Compare(q.Key, "name", true) == 0)
                    //    .Value;
     
                    //if (name == null)
                    //{
                    //    // Get request body
                    //    //dynamic data = await req.Content.ReadAsAsync<object>();
                    //    dynamic data = req.Content.ReadAsAsync<object>();
     
                    //    name = data?.name;
                    //}
                    log.Info("C# HTTP trigger function processed a request END.");
                }
     
     
                return req.CreateResponse(HttpStatusCode.OK, "OK Access");
            }
        }
    Coté client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    static void Main(string[] args)
            {
     
     
     
                ServicePointManager.ServerCertificateValidationCallback =
                (object a, System.Security.Cryptography.X509Certificates.X509Certificate b, System.Security.Cryptography.X509Certificates.X509Chain c, System.Net.Security.SslPolicyErrors d) => { return true; };
                //var url = "https://progiscadap-testslot1.azurewebsites.net/api/FTest";
     
                for (int i = 0; i<4;i++)
                {
                    Thread at = new Thread(TestWeb);
                    at.Start();
                }
     
                Console.ReadLine();
            }
     private static void TestWeb()
            {
                var url = "https://myazure-tests1.azurewebsites.net/api/FTest";
                HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
     
                HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
                StreamReader sr = new StreamReader(resp.GetResponseStream());
                string results = sr.ReadToEnd();
                results = results.Replace("\"", string.Empty);
     
                sr.Close();
                Console.WriteLine(results);
            }
    Merci de ne pas mettre une valeur trop haute dans la ligne for (int i = 0; i<4;i++).

    Plus grave : Rien sur Google .... personne n'est au courant !

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    février 2007
    Messages
    819
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : février 2007
    Messages : 819
    Points : 1 487
    Points
    1 487
    Par défaut
    Salut,

    Les azure functions etant prevues comme etant stateless et pensees pour etre isolees les unes des autres ce n'est pas tres surprenant.

    Que veux tu faire, qui a besoin de lock ? Il y a sans doute un moyen d'eviter cela...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    mai 2011
    Messages
    670
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : mai 2011
    Messages : 670
    Points : 92
    Points
    92
    Par défaut
    Lundi je vais essayer le mot clé 'volatile' sur la variable object lock.

    Bon
    j'ai besoin de 'lock' car je gére un cache , et une connexion base de donnée.
    dans static demaclasse() (c'est à dire constructeur statique de ma classe) j'initialise objet lock et base de donnée et ca passe plusieurs fois quand plusieurs requête http en paralléle provenant du client, ce qui n'est pas bon.
    Il doit passer qu'une seule fois.
    J'initialise object lock et base de donnée uniquement à la premier requête http .
    A la premiere requete http le constructeur statique est appelée .

    Question :
    Existe t'il une méthode trigger du genre 'oninit' appellé au démarrage du slot de function app ???
    Si oui comment ?
    Je deplacerai tous initialisation vers cette méthode.

    Voilà.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    février 2007
    Messages
    819
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : février 2007
    Messages : 819
    Points : 1 487
    Points
    1 487
    Par défaut
    Pour le cache, evite de le gerer dans une fonction azure, elle sont censees etre stateless, donc sans cache. Tu devrais logiquement gerer le cache au dessus.

    Pour le lock de base de donnees, ton SGBD gere deja bien assez de lock dans tous les sens tu ne devrais pas avoir a en mettre en plus en place.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    mai 2011
    Messages
    670
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : mai 2011
    Messages : 670
    Points : 92
    Points
    92
    Par défaut
    Citation Envoyé par mermich Voir le message
    Pour le cache, evite de le gerer dans une fonction azure, elle sont censees etre stateless, donc sans cache. Tu devrais logiquement gerer le cache au dessus.

    Pour le lock de base de donnees, ton SGBD gere deja bien assez de lock dans tous les sens tu ne devrais pas avoir a en mettre en plus en place.
    qu'est que tu veux dire 'Tu devrais logiquement gerer le cache au dessus.' ?

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    mai 2011
    Messages
    670
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : mai 2011
    Messages : 670
    Points : 92
    Points
    92
    Par défaut
    Citation Envoyé par mermich Voir le message
    Pour le cache, evite de le gerer dans une fonction azure, elle sont censees etre stateless, donc sans cache. Tu devrais logiquement gerer le cache au dessus.

    Pour le lock de base de donnees, ton SGBD gere deja bien assez de lock dans tous les sens tu ne devrais pas avoir a en mettre en plus en place.
    Je me suis mal expliquer le cache n'a rien à voir avec la connection BD le cache que je gére ce sont les tokens sous forme ex
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static List<int> LESTOKENS;
    qui sont initialisé dans le constructeurs statiques de ma classe).
    Ma function app communique avec la base de donnée et créer un token
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LESTOKENS.Add(idnewtoken=random.Next());
    si connection est ok.



    voilà.

  7. #7
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    février 2007
    Messages
    819
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : février 2007
    Messages : 819
    Points : 1 487
    Points
    1 487
    Par défaut
    Qu'est ce qui interroges tes fonctions azure ?

    du js, un site web ?
    c'est a ce niveau-la que le cache devrais etre gerer.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    mai 2011
    Messages
    670
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : mai 2011
    Messages : 670
    Points : 92
    Points
    92
    Par défaut
    Citation Envoyé par mermich Voir le message
    Qu'est ce qui interroges tes fonctions azure ?

    du js, un site web ?
    c'est a ce niveau-la que le cache devrais etre gerer.
    Un programme c# qui accéde au web.
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
     
                    HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
                    StreamReader sr = new StreamReader(resp.GetResponseStream());
                    results = sr.ReadToEnd();
                    results = results.Replace("\"", string.Empty);

Discussions similaires

  1. [Débutant] Function apps detection
    Par yann458 dans le forum Microsoft Azure
    Réponses: 1
    Dernier message: 18/09/2019, 12h54
  2. [Débutant] Function apps http et base de donnée
    Par yann458 dans le forum Microsoft Azure
    Réponses: 0
    Dernier message: 13/09/2019, 09h19
  3. Avertissement Function
    Par James64 dans le forum Langage
    Réponses: 1
    Dernier message: 30/11/2005, 15h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo