Vb .Net Service Windows Pbl [Résolu]

Signaler
Messages postés
79
Date d'inscription
mardi 4 juin 2002
Statut
Membre
Dernière intervention
29 juillet 2005
-
Messages postés
79
Date d'inscription
mardi 4 juin 2002
Statut
Membre
Dernière intervention
29 juillet 2005
-
Bonjour,

J'ai developpé un service en Vb .Net qui met à jour l'heure et la date d'une machine avec ceux de l'horloge parlante.

Pour cela j'ai besoin de récupérer le contenu d'une page web ensuite j'effectue mon découpage.

J'utilise cette syntaxe pour récupérer la source de ma page web.

Dim sRet As String = System.Text.Encoding.Default.GetString(New Net.WebClient().DownloadData ("http://www.horlogeparlante.com"))

Cette syntaxe fonctionne parfaitement en mode application. Existe t'il une syntaxe similaire pour le mode service car cette syntaxe a l'aire de poser problème.

Merci d'avance

Ricks27

25 réponses

Messages postés
1522
Date d'inscription
mardi 18 décembre 2001
Statut
Modérateur
Dernière intervention
21 août 2010
5
Pas si ton service tourne sous un compte special car ceux ci n'ont pas de profile. Et le proxy IE est stocké dans le profile de chaque utilisateur. Sinon voir les methodes static (oups Shared en VB) de la classe Proxy :)

A++

:-p Crazyht :)
MVP Visual C#.NET

[Admin Codes-Sources]
[Membre Developer-Association]
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 110 internautes nous ont dit merci ce mois-ci

Messages postés
1522
Date d'inscription
mardi 18 décembre 2001
Statut
Modérateur
Dernière intervention
21 août 2010
5
Les service Windows qui tournent sous le compte LocalSystem n'ont pas d'acces au reseau (et donc au web). Essaie de modifier l'utilisateur de lancement de ton service, ca devrait suffir :)

A++

:-p Crazyht :)
MVP Visual C#.NET

[Admin Codes-Sources]
[Membre Developer-Association]
Messages postés
79
Date d'inscription
mardi 4 juin 2002
Statut
Membre
Dernière intervention
29 juillet 2005

Tout d'abord merci d'avoir répondu à mon message Crazyht.

Si j'ai bien compri il me suffit juste, dans ma classe Installer de modifier le compte en mettant "NetworkService" au lieu de "Localsystem".

Cependant j'ai une petite question, si je peux me permettre.
Mon service est déja enregistré sur ma machine et lorsque je l'enregistre de nouveau, il ne prend pas en compte le changement de compte. Existe t'il un utilitaire fourni avec le framework qui permettrait de désinstallé un service. (Un pe comme InstallUtil qui permet de l'installer)

En attendant, j'ai modifier le compte manuellement, en modifiant les propriétés du service.
Je me suis inspiré d'un service qui tournait sur un compte "Service Réseau". (Compte : NT AUTHORITY\NetworkService et MP : Pass du compte administrateur de la machine).

Mais cela ne semble pas fonctionner.

Merci

Ricks27
Messages postés
1522
Date d'inscription
mardi 18 décembre 2001
Statut
Modérateur
Dernière intervention
21 août 2010
5
InstallUtil /u comme uninstall :)

Service Reseau n'a peut etre pas les droits de modifier l'heure systeme. Si ca ne passe pas apres réinstall, tente en mettant un admin systeme pour demarrer le service(lui au moins on est sur qu'il a le droit au reseau et a l'heure) .

A++

:-p Crazyht :)
MVP Visual C#.NET

[Admin Codes-Sources]
[Membre Developer-Association]
Messages postés
79
Date d'inscription
mardi 4 juin 2002
Statut
Membre
Dernière intervention
29 juillet 2005

J'ai désinstallé et réinstallé mon service avec "Networkservice" comme compte dans ma classe installer mais sans résultat.

J'ai donc essayé avec un admin system pour voir si cela venait d'un problème de droits. Ca ne fonctionne toujours pas.

J'ai remarqué, en faisant des services, que pour la même chose, en mode application ou en mode service, la syntaxe changeait. Je ne sais pas si le problème pourait venir de la. Je ne fais qu'émettre une hypothèse.

Car ca ne semble pas venir d'un problème d'autorisations.

Je dois te saouler avec toutes mes questions.

Merci tout de même pour tes précieuses réponses.

Par contre si tu pense à autre chose, n'hesites pas.

Ricks27

PS : Y aurait il possibilité que l'on fasse des transferts de connaissance, en ce qui concerne la programmmation, sur un logiciel de messagerie instantanée comme msn ou autre??
Messages postés
1522
Date d'inscription
mardi 18 décembre 2001
Statut
Modérateur
Dernière intervention
21 août 2010
5
Quels changement as tu remarqué dans la syntaxe entre les 2 modes ?

Pour la communication live, si tu as de la chance, je passe de temps a autre sur IRC le soir

A++

:-p Crazyht :)
MVP Visual C#.NET

[Admin Codes-Sources]
[Membre Developer-Association]
Messages postés
79
Date d'inscription
mardi 4 juin 2002
Statut
Membre
Dernière intervention
29 juillet 2005

Je te donne certain exemples qui me reviennent à l'esprit.

1) Chemin Application

Application :

Application.StartupPath

Service :

Path.GetDirectoryName([Assembly].GetExecutingAssembly().Location)

2) Timer

Application :

Private Sub TimerName_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TimerName.Tick

Services :

Private Sub TimerName_Elapsed(ByVal sender As System.Object, ByVal e As System.Timers.ElapsedEventArgs) Handles TimerName.Elapsed

......

La liste est bien sur plus longue mais je n'ai pas les codes sous les yeux pour te la donner en détail.

En fait, d'après ce que j'ai pu voir, certaines classes ou objet sont propres à l'application et d'autres au services.

Ce qui est tout à fait logique car un service est complètement d'ifférent d'une application windows.

Ricks27
Messages postés
1522
Date d'inscription
mardi 18 décembre 2001
Statut
Modérateur
Dernière intervention
21 août 2010
5
En fait Path.GetDirectoryName([Assembly].GetExecutingAssembly().Location) fonctionne a tous les coups et c celui que j'utilise :)

Sinon l'autre difference est due au fait que dans le mode Appli tu utiliser un composant Winforms Timer et dans l'autre Cas un composant plus général. Il est a noté que le timer qui tourne avec les service fonctionne aussi tres bien s'il est placé sur une Form.

Mais en effet de maniere general tous les composant specifique Winforms ne fonctionne pas avec un service (comme il ne fonctionne pas sur une page Web)

A++

:-p Crazyht :)
MVP Visual C#.NET

[Admin Codes-Sources]
[Membre Developer-Association]
Messages postés
79
Date d'inscription
mardi 4 juin 2002
Statut
Membre
Dernière intervention
29 juillet 2005

Et sinon pour mon problème, tu ne pense pas que ca pourait venir d'un problème de syntaxe plutôt que de droits.
Car j'ai tracé le service et ca bloque juste sur cette ligne. Je n'ai aucune erreur retournée.

Ricks27
Messages postés
1522
Date d'inscription
mardi 18 décembre 2001
Statut
Modérateur
Dernière intervention
21 août 2010
5
Car j'ai tracé le service et ca bloque juste sur cette ligne.

Quelle ligne ???????????

A++

:-p Crazyht :)
MVP Visual C#.NET

[Admin Codes-Sources]
[Membre Developer-Association]
Messages postés
79
Date d'inscription
mardi 4 juin 2002
Statut
Membre
Dernière intervention
29 juillet 2005

Celle citée plus haut c'est à dire

Dim sRet As String = System.Text.Encoding.Default.GetString(New Net.WebClient().DownloadData ("http://www.horlogeparlante.com"))

Ricks27
Messages postés
1522
Date d'inscription
mardi 18 décembre 2001
Statut
Modérateur
Dernière intervention
21 août 2010
5
Hum non je ne pense pas, mais trace l'exception qui est generée (Type + Message), ca nous en dira peut etre plus sur la cause (et la solution) de ton probleme :)

A++

:-p Crazyht :)
MVP Visual C#.NET

[Admin Codes-Sources]
[Membre Developer-Association]
Messages postés
79
Date d'inscription
mardi 4 juin 2002
Statut
Membre
Dernière intervention
29 juillet 2005

C'est ce que j'ai fait. Mais je n'ai aucune exception générée.

Voici le code ou ca pose problème :

-------------------------------------------

Sub Synchronisation()
Try
Dim sRet As String = System.Text.Encoding.Default.GetString(New Net.WebClient().DownloadData("http://www.horlogeparlante.com"))
Dim Balisedébut As String, BaliseFin As String, MyTime As String
Dim LenBaliseDébut As Long, LenBaliseFin As Long, TailleDateHeure As Long, i As Long, n As Long
Dim nTime As Date, nDte As Date

Balisedébut = "Heure locale et date :"
BaliseFin = "Décalage horaire :"
LenBaliseDébut = Len(Balisedébut)
LenBaliseFin = Len(BaliseFin)
TailleDateHeure = 19

i = InStr(1, sRet, BaliseFin) - LenBaliseFin
If i > 0 Then
sRet = Mid(sRet, 1, i)
n = InStrRev(sRet, Balisedébut) + LenBaliseDébut
If n > 0 Then
MyTime = Mid(sRet, n, i)
MyTime = Mid(Trim(MyTime), InStr(1, MyTime, " ") + 1, TailleDateHeure)

nTime = Trim(Mid(MyTime, InStr(1, MyTime, " ") + 1))
nDte = CDate(Mid(MyTime, 1, InStr(1, MyTime, " ") - 1))

Today = nDte
TimeOfDay = nTime

End If
End If

Catch ex As Exception
EcrisDansFichier(CheminLog, "Erreur : " & ex.ToString)
End Try
End Sub

--------------------------------------
Messages postés
1522
Date d'inscription
mardi 18 décembre 2001
Statut
Modérateur
Dernière intervention
21 août 2010
5
As tu essayer de logger ce que tu recois dans sRet ?

3 petits conseils :
- Evite les accents dans les nom de variables et autre (Balisedébut)

- Prefere sRet.SubString (n, i) à Mid(sRet, n, i) (idem pour Left/Right/Len/InStr)

- Date est gardé pour la conversion VB6 prefere DateTime du coup :
Dim dt as DateTime
dt = DateTime.Parse (MyTime)

au lieu de
nTime = Trim(Mid(MyTime, InStr(1, MyTime, " ") + 1))
nDte = CDate(Mid(MyTime, 1, InStr(1, MyTime, " ") - 1))

A++

:-p Crazyht :)
MVP Visual C#.NET

[Admin Codes-Sources]
[Membre Developer-Association]
Messages postés
79
Date d'inscription
mardi 4 juin 2002
Statut
Membre
Dernière intervention
29 juillet 2005

Je suis d'accord pour les conseils. C l'habitude du vb6.

J'ai essayé de logger ce que je recois dans sRet mais il s'arrète sur la ligne avec le sret. Je ne peux donc pas savoir ce qu'il me retourne.

En fait, il va jusko sRet puis plus rien. Comme s'il plantait sauf que la ce n'est pas la cas.

Ricks27
Messages postés
308
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
23 mars 2010

Ricks27 a peine nouveau il fais déja chier son monde mdr! :big)

_______________________
4L!@$ >>>>
Messages postés
1522
Date d'inscription
mardi 18 décembre 2001
Statut
Modérateur
Dernière intervention
21 août 2010
5
As tu attendu longtemps ?
Utilises tu un proxy pour ton acces Web ?

Me demande tout simplement si DownloadData n'est pas blocant en cas d'erreur.

Si tu utilise un proxy une WebRequest serait plus adaptée et parametrable (Surtout s'il nececite authentification).

A++

:-p Crazyht :)
MVP Visual C#.NET

[Admin Codes-Sources]
[Membre Developer-Association]
Messages postés
1522
Date d'inscription
mardi 18 décembre 2001
Statut
Modérateur
Dernière intervention
21 août 2010
5
alias666 toi t'es pas nouveau, mais tes commentaires sont pas plus intelligents

Merci pour cette remarque constructive

A++

:-p Crazyht :)
MVP Visual C#.NET

[Admin Codes-Sources]
[Membre Developer-Association]
Messages postés
79
Date d'inscription
mardi 4 juin 2002
Statut
Membre
Dernière intervention
29 juillet 2005

Disons ke je peux attendre d heures sans k'il ne se passe rien.

Je passe effectivement par un proxy pour avoir accès o net.

Tu as peux être raison pour le DownloadData qui peut être blocant en cas d'erreur. J'ai déja entendu parlé de WebRequest , je vais essayé.
Peut être que le DownloadData n'est pas adapté pour les services.

En ce qui concerne Alias666 ne t'en fais pas, c mon stagiaire. En fait. Il é chiant mais c un brave gas.

Ricks27
Messages postés
79
Date d'inscription
mardi 4 juin 2002
Statut
Membre
Dernière intervention
29 juillet 2005

Par contre si tu connais l'équivalence de :

Dim sRet As String = System.Text.Encoding.Default.GetString(New Net.WebClient().DownloadData ("http://www.horlogeparlante.com"))

Avec WebRequest, je suis preneur.

Merci

Ricks27