IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

VB 6 et antérieur Discussion :

Problème d'exécution en release mais pas en debug (2) [Trucs & Astuces]


Sujet :

VB 6 et antérieur

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 62
    Points : 55
    Points
    55
    Par défaut Problème d'exécution en release mais pas en debug (2)
    Bonjour,

    Je rejoints le problème évoqué par le message suivant : http://www.developpez.net/forums/sho...ighlight=debug.
    Je travaille sur une vieille application en vb 6 ASP qui intérroge un web service en envoyant la trame http directement créée dans le code. L'environnement est Windows 20003 server.

    Dans dans mon cas, il s'agit de dll compilées et non d'un exécutable. Lorsque je suis en debug et que je lance l'IHM, l'appel à cette fonction dans le composant fonctionne. Quand je ne suis plus en debug, ça ne marche plus.
    Il plante sur la partie suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ServerXMLHTTP_o.send (SoapRequest_s)
    Cet objet est défini par un createObject dont la valeur est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Global Const C_SERVERXMLHTTP     As String = "MSXML2.ServerXMLHTTP.4.0"
    Une idée sur ce qu'il faut faire ?

    Voici le code de la fonction

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
     
    Public Function invoquerMachin(ByVal p_NumeroTelephone_s As String, _
                                          ByVal p_CodeOffre_s As String, _
                                          ByRef p_reponseServiceWeb_o As Object) _
                                          As String
     
        Dim ServerXMLHTTP_o As Object
        Dim Base64_o As Object
        Dim SoapRequest_s As String
        Dim AsynchroneMode_b As Boolean
     
    On Error GoTo Erreur
     
        a_Trace_o.tracer C_TRACEFONCTION, "DEBUT --- "
     
        AsynchroneMode_b = False
     
        'Creation de la requete SOAP
        SoapRequest_s = createSoapRequest(p_NumeroTelephone_s, p_CodeOffre_s, a_InfoClient_s, a_Version_s)
        a_Trace_o.tracer C_TRACEDEBUG, "SOAP Request = " & SoapRequest_s
     
        'Connection au  service web
        Set ServerXMLHTTP_o = CreateObject(C_SERVERXMLHTTP)
        ServerXMLHTTP_o.Open "POST", a_URLServiceWeb_s, AsynchroneMode_b
     
        'Mise en place des Headers pour le type du document
        ServerXMLHTTP_o.setRequestHeader "Content-Type", "text/xml"
        ServerXMLHTTP_o.setRequestHeader "charset", "utf-8"
     
        'A cause d'un bug reference de ServerXMLHTTP, il faut definir deux fois le cookie :((
        ServerXMLHTTP_o.setRequestHeader "Cookie", a_SessionID_s
        ServerXMLHTTP_o.setRequestHeader "Cookie", a_SessionID_s
     
        'Encodage BASE64 du login:password pour le basic authentification de SSL
        Set Base64_o = New Base64
        Dim Authorization_s As String
        Authorization_s = "Basic " & Base64_o.Encode(a_LoginSSL_s & ":" & a_PasswordSSL_s)
        ServerXMLHTTP_o.setRequestHeader "Authorization", Authorization_s
        Set Base64_o = Nothing
        ServerXMLHTTP_o.setRequestHeader "SOAPAction", a_URNServiceWeb_s
     
        'Positionnement sur le proxy pour la connexion (s'il y a lieu d'utiliser un proxy biensur)
        If a_ProxyHost_s <> "" Then
            If a_ProxyPort_s <> "" Then
                ServerXMLHTTP_o.setProxy C_SXH_PROXY_SET_PROXY, a_ProxyHost_s & ":" & a_ProxyPort_s
            Else
                ServerXMLHTTP_o.setProxy C_SXH_PROXY_SET_PROXY, a_ProxyHost_s
            End If
        End If
        If a_ProxyLogin_s <> "" Then
            ServerXMLHTTP_o.setProxyCredentials a_ProxyLogin_s, a_ProxyPassword_s
        End If
     
        'Envoi de la requete SOAP au service WEB
        a_Trace_o.tracer C_TRACEDEBUG, "Avant le send " & Now
        ServerXMLHTTP_o.send (SoapRequest_s)
        a_Trace_o.tracer C_TRACEDEBUG, "Apres le send 1 " & Now
     
        'Traitement de la reponse
        'Y a t-il une erreur HTTP ?
        a_Trace_o.tracer C_TRACEDEBUG, "TEST"
        a_Trace_o.tracer C_TRACEDEBUG, ServerXMLHTTP_o.Status
        If ServerXMLHTTP_o.Status <> 200 Then
     
            invoquerMachin = "Erreur HTTP (" & ServerXMLHTTP_o.Status & ")"
            a_Trace_o.tracer C_TRACEERREUR, "Erreur HTTP (" & ServerXMLHTTP_o.Status & ")"
            a_Trace_o.tracer C_TRACEDEBUG, "Response Text(" & ServerXMLHTTP_o.responseText & ")"
            Set p_reponseServiceWeb_o = Nothing
     
        Else
     
            a_Trace_o.tracer C_TRACEDEBUG, "Cookie = " & a_SessionID_s
            'Pour le moment un bug empeche d'utiliser les sessions,
            'alors on utilise toujours le Cookie SMCHALLENGE=YES et pas SMSESSION=...
            'If a_SessionID_s = C_SMCHALLENGE Then
            '    a_SessionID_s = getHeader(ServerXMLHTTP_o, "Set-cookie", "SMSESSION")
            '    a_Trace_o.tracer C_TRACEDEBUG, "Set-Cookie = " & a_SessionID_s
            'End If
            Set p_reponseServiceWeb_o = ServerXMLHTTP_o.responseXML
            a_Trace_o.tracer C_TRACEDEBUG, "SOAP Response = " & p_reponseServiceWeb_o.xml
            invoquerMachin = CStr(C_OK)
     
        End If
     
        GoTo Fin
     
    Erreur:
     
        If Err.Number <> 0 Then
            invoquerMachin = "Erreur VB ( " & Err.Description & ")"
            a_Trace_o.tracer C_TRACEERREUR, "Erreur VB (" & Err.Description & ")"
        Else
            invoquerMachin = "Erreur HTTP (Impossible de se connecter à la DIVOP)"
            a_Trace_o.tracer C_TRACEERREUR, "Erreur HTTP (Impossible de se connecter à la DIVOP)"
        End If
        Set p_reponseServiceWeb_o = Nothing
     
    Fin:
        Set Base64_o = Nothing
        Set ServerXMLHTTP_o = Nothing
     
        a_Trace_o.tracer C_TRACEFONCTION, "FIN   --- "
    End Function

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Points : 1 418
    Points
    1 418
    Par défaut
    Bonjour,

    ?err.description
    ?err.number


    Merci

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 62
    Points : 55
    Points
    55
    Par défaut
    Err number vaut 0
    Err description est vide et tous les autres champs aussi...

  4. #4
    Membre expert Avatar de OhMonBato
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    2 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 660
    Points : 3 685
    Points
    3 685
    Par défaut
    Si tu désactive ton On Error pour test, quand il plante en mode compilé, il te met une fenetre "Erreur 0" ?
    Pour VB6 : N'oubliez pas d'aller voir la FAQ et les Tutoriels
    Vous trouvez une reponse particulierement utile ? Votez pour !

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 62
    Points : 55
    Points
    55
    Par défaut
    Par désactiver tu entends bien supprimer la ligne On Error ?
    Non, il plante plus loin (une structure non renseignée doit être lue j'imagine) mais l'erreur est traitée plus loin.

  6. #6
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Points : 1 418
    Points
    1 418
    Par défaut
    Tu le fais exprès

    Comment veux-tu qu'on réponde à "ça ne marche pas"
    Que vaut "soapRequest_s" ?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 62
    Points : 55
    Points
    55
    Par défaut
    He bien ça ne marche pas, j'ai précisé la ligne fautive.
    En debug j'arrive à appeler le web service, en release non, l'envoi de la requête SOAP génère une erreur sans decription.

    Voici la valeur de soapRequest_s
    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
     
    <?xml version='1.0' encoding='utf-8' ?>
    <SOAP-ENV:Envelope
      xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <SOAP-ENV:Body>
        <ns1:getEligibilite xmlns:ns1="urn:Eligibilite/G2">
          <nd         xsi:type="xsd:string" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">0123457689</nd>
          <etoile     xsi:type="xsd:boolean" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">false</etoile>
          <offre      xmlns:ns2="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns2:Array" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" ns2:arrayType="xsd:string[1]">
          <item       xsi:type="xsd:string">107</item>
          </offre>
          <infoclient xsi:type="xsd:string" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">TRANSPAC</infoclient>
          <p_sVersion xsi:type="xsd:string" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">G02R00</p_sVersion>
        </ns1:getEligibilite>
      </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 62
    Points : 55
    Points
    55
    Par défaut
    J'avance
    En fait, le fait de faire un appel à a_Trace_o.tracer C_TRACEERREUR, efface le numéro d'erreur et la description, donc j'ai réussi à avoir le numéro et la description :
    Err.Number : -2147012852
    Err.Description : A certificate is required to complete client authentication

    J'ai le certificat de sécurité. En debug, ça fonctionne quand je l'importe (Outils Internet > Content > Certificates) dans Personal mais pas en release. Il y a plusieurs onglets et je ne peux pas importer le certificat partout :
    - Personal (OK)
    - Other People (OK)
    - Intermediate Certificate User (KO)
    - Trusted Root Certification Authorities (KO)
    - Trusted Publishers (OK)
    - Untrusted Publishers (OK)

    Je dois sûrement l'importer autre part ou d'une autre façon.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 62
    Points : 55
    Points
    55
    Par défaut
    J'ai trouvé d'où vient le problème.
    En fait, en debug, c'est le compte administrateur qui exécute tout donc aucun problème. En release, c'est le compte virtuel NETWORK SERVICES (NT AUTHORITY) qui est utilisé. Et ce compte n'a pas accès aux certificats. Je n'ai pas trouvé comment faire.

    Je me suis rendu compte de ça avec regmon. En debug, il allait lire
    HKCU\Software\Microsoft\SystemCertificates\My\Certificates et trouvait bien le certificat. En release, il allait lire exactement la même clef et il ne trouvait rien. J'ai donc compris un peu tard que le HKEY_CURRENT_USER ne définit pas l'utilisateur connecté mais l'utilisateur qui est utilisé. (Logique me diriez-vous mais, par exemple, pour NETWORK SERVICES, il existe des paramètres dans la base des registres dans HKU\S-1-5-1-20 (je ne sais pas si c'est la même valeur pour tous les windows server 2003). Je m'attendais donc à ce que regmon me mette cette clé et nom HKCU car il lit bien HKU mais écrit HKCU.)

    Donc plutôt que de chercher comment installer le certificat pour l'utilisateur, j'ai pris le problème autrement. J'ai changé l'utilisateur dans l'application pool pour l'application. J'ai mis l'administrateur et ça marche. Je vais essayer de trouver une solution intermédiaire car les droits administrateurs ce n'est jamais une bonne idée mais au moins le problème a une solution.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 62
    Points : 55
    Points
    55
    Par défaut
    Finalement j'ai encore eu d'autres problèmes.
    La solution ci-dessus ne fonctionne que si un utilisateur est connecté. En effet, lors du send, l'application vérifie au niveau de l'utilisateur (HKEY_CURRENT_USER) et si aucun utilisateur n'est connecté, ça ne fonctionne pas.

    Pour que le certificat soit lu au niveau de HKEY_LOCAL_MACHINE, il faut ajouter la ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ServerXMLHTTP_o.setOption(3) = "LOCAL_MACHINE\My\"
    (Le 3 correspond à SXH_OPTION_SELECT_CLIENT_SSL_CERT.)

    Donc là il va aller lire dans le magasin "Personnel" de la machine le premier certificat qu'il lit (vous pouvez ajouter le nom mais en dur dans le code...). Il faudra importer le certificat au niveau de la machine via mmc.exe

    Ensuite il y a encore un autre problème de droits. En donnant les droits ADMINISTRATEUR à l'utilisateur NETWORK SERVICES, ça fonctionne. Plus en détails, je ne sais pas d'où vient le problème.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 62
    Points : 55
    Points
    55
    Par défaut
    Bon, j'ai eu encore d'autres problèmes :-) Mais cette fois ce sont les derniers.
    la correction précédente pose problème si plusieurs certificats sont installés. Il est donc préférable d'ajouter un paramètre (base des registres dans notre cas) avec le nom du certificat.

    Concernant le fait de rajouter l'utilisateur NETWORK_SERVICES, ce n'est qu'une solution de secours et nous avons trouvé pourquoi cela fonctionne avec cette manipulation un peu « facile ».
    Cela vient du fait qu'il existe des droits d'accès à la clé privée du certificat. Le groupe ADMINISTRATOR les a forcément donc la manipulation précédente fonctionne.
    Pour donner les droits à l'utilisateur NETWORK_SERVICES, nous avons utilisé l'outils winhttpcertcfg.exe (télécharger winhhtpcertcfg.exe sur le site de Microsoft)
    Pour donner les droits à l'utilisateur (dans notre cas le groupe IIS_WPG auquel appartient NETWORK_SERVICES), il faut utiliser la commande suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    winhttpcertcfg.exe -g -c LOCAL_MACHINE\My -s "nom du certificat" -a IIS_WPG

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Exception en release mais pas en debug
    Par max-mag dans le forum Débuter
    Réponses: 2
    Dernier message: 22/08/2014, 16h32
  2. Acces violation avec la version release, mais pas la debug
    Par Matthieu Brucher dans le forum Qt
    Réponses: 5
    Dernier message: 07/03/2010, 21h20
  3. Problème Exécution en Release mais pas en Debug
    Par nono27200 dans le forum VB 6 et antérieur
    Réponses: 67
    Dernier message: 08/11/2007, 16h55
  4. Problème d'affichage sous firefox mais pas IE
    Par hibou-garou dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 18/12/2006, 11h24
  5. [débutant] fonction s'exécutant en C mais pas en C++
    Par goran kajfes dans le forum Débuter
    Réponses: 8
    Dernier message: 28/12/2005, 21h04

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