OVH Cloud OVH Cloud

Asynchrone & mode="StateServer"

4 réponses
Avatar
Loubet
- Outils de développement utilisé : Visual Studio .NET 2003
- Version du Framework .NET : 1.1

Bonjour,

Savez vous s'il est possible de faire de l'asynchrone en mode="StateServer"
? A priori non puisque mon projet fonctionne correctement quand je suis en
mode="InProc" mais des fois que quelqu'un connaisse une astuce... En
stateServer, tout est ok, sauf que mon EndInvoke ne met pas a jour ma
variable de session.

Si la reponse est non, savez vous si passer en asp 2.0 resoudrait mon
problème ?

Merci par avance,

Loubet

p.s : merci de ne pas disserter sur les mefaits ou les bienfaits de
l'asynchrone, je cherche juste deseperement l'info.

4 réponses

Avatar
Benjamin Guinebertière [MS]
Le StateServer ne sert qu'à stocker la session. Il y a trois mode: Inproc
conserve les données de session dans la mémoire du serveur Web (cela ne peut
donc pas fonctionner sur une ferme Web), StateServer conserve les données de
session dans la mémoire d'un service Windows (le StateServer). Le troisième
mode est le stockage des données de session dans SQL Server qui est le cas
classique avec des fermes Web.

Par ailleurs, le principe sur lequel est conçu ASP.NET est qu'une requête
Web (de la réception du GET HTTP à l'envoi de la réponse) est traité dans
ASP.NET par un unique thread.
La méthode BeginInvoke exécute une méthode dans un autre thread (cf
http://msdn.microsoft.com/msdnmag/issues/04/06/BasicInstincts/ par exemple
pour plus de détails).

Puvez-vous préciser comment la mise à jour de la variable de session est
effectuée (dans le thread de la requête ou dans le thread qui exécute la
méthode sur laquelle le BeginInvoke a lieu) et suivant quelle syntaxe?
Cela pourra nous aider je l'espère à répondre à votre question.

Par ailleurs, il est possible que la différence de comportement ne soit pas
liée à l'asynchronisme, par exemple si vous stockez en session des éléments
non sérialisables.
cf http://support.microsoft.com/default.aspx/kb/312112/en-us

Enfin, à votre demande, je ne disserte pas sur synchronisme et asynchronisme
et les moyens d'implémenter cela !

--
Benjamin Guinebertière
Microsoft France

Ce message est fourni en l'état, sans garantie d'aucune sorte, et ne vous
confère aucun droit. Vous assumez tous les risques liés à son utilisation.



"Loubet" wrote in message
news:
- Outils de développement utilisé : Visual Studio .NET 2003
- Version du Framework .NET : 1.1

Bonjour,

Savez vous s'il est possible de faire de l'asynchrone en
mode="StateServer"
? A priori non puisque mon projet fonctionne correctement quand je suis en
mode="InProc" mais des fois que quelqu'un connaisse une astuce... En
stateServer, tout est ok, sauf que mon EndInvoke ne met pas a jour ma
variable de session.

Si la reponse est non, savez vous si passer en asp 2.0 resoudrait mon
problème ?

Merci par avance,

Loubet

p.s : merci de ne pas disserter sur les mefaits ou les bienfaits de
l'asynchrone, je cherche juste deseperement l'info.



Avatar
Loubet
Merci beaucoup de votre réponse !

1er precision importante, mon objet passé en session herite de la classe
ReportingService de MS. (Peut être suis trop gourmand ? cependant j'ai testé
sans l'heritage, elle se resume donc a trois proprietes texte et 4 fonctions,
meme resultat...)
Elles est bien sur serializable et passe le test du vidage xml vers le
disque sans soucis quand je n'herite pas de ReportingService (suis pas sur
que ce soit orthodoxe mais c'est ma technique, valable ?)

voici mes deux fonctions :

Public Function ExporterAsynchrone() As String

If pEnTraitement Then Exit Function
Try
pInitialisation = True
pEnTraitement = True
SyncLock Me
Dim oDelegate As New DelegueAjouter(AddressOf Exporter)
Dim oAsync As AsyncCallback = New AsyncCallback(AddressOf
ExporterAsynchroneFin)
Dim iAr As IAsyncResult = oDelegate.BeginInvoke(oAsync,
oDelegate)
End SyncLock
Return "Initialisation de l'impression réussie"
Catch ex As Exception
Return ex.Message
End Try

End Function

et

Private Sub ExporterAsynchroneFin(ByVal iAr As IAsyncResult)
pEnTraitement = False
SyncLock Me
Dim oDelegate As DelegueAjouter = CType(iAr.AsyncState,
DelegueAjouter)
oDelegate.EndInvoke(iAr)
End SyncLock
End Sub

ma variable est mise à jour dans la fonction Exporter, cad dans le
BeginInvoke.
precision : c'est ma fonction exporter qui lance le Render de
ReportingService, enregistre sur disque un pdf et répond en mettant à jour le
chemin du fichier dans l'objet courant (ca precisement qui ne marche pas)

j'avoue ne pas avoir testé l'export asynchrone natif de ReportingService,
j'aurai voulu un avis eclairé avant de revoir ce dev qui est en production
depuis un moment.

concernant la discussion sur l'asynchronisme, sachant que je cherche à
lancer des reports tres lourds (plusieurs minutes) sans bloquer les
utilisateurs, je suis bien sur preneur de conseil avisé ! ;)

merci encore






"Benjamin Guinebertière [MS]" a écrit :

Le StateServer ne sert qu'à stocker la session. Il y a trois mode: Inproc
conserve les données de session dans la mémoire du serveur Web (cela ne peut
donc pas fonctionner sur une ferme Web), StateServer conserve les données de
session dans la mémoire d'un service Windows (le StateServer). Le troisième
mode est le stockage des données de session dans SQL Server qui est le cas
classique avec des fermes Web.

Par ailleurs, le principe sur lequel est conçu ASP.NET est qu'une requête
Web (de la réception du GET HTTP à l'envoi de la réponse) est traité dans
ASP.NET par un unique thread.
La méthode BeginInvoke exécute une méthode dans un autre thread (cf
http://msdn.microsoft.com/msdnmag/issues/04/06/BasicInstincts/ par exemple
pour plus de détails).

Puvez-vous préciser comment la mise à jour de la variable de session est
effectuée (dans le thread de la requête ou dans le thread qui exécute la
méthode sur laquelle le BeginInvoke a lieu) et suivant quelle syntaxe?
Cela pourra nous aider je l'espère à répondre à votre question.

Par ailleurs, il est possible que la différence de comportement ne soit pas
liée à l'asynchronisme, par exemple si vous stockez en session des éléments
non sérialisables.
cf http://support.microsoft.com/default.aspx/kb/312112/en-us

Enfin, à votre demande, je ne disserte pas sur synchronisme et asynchronisme
et les moyens d'implémenter cela !

--
Benjamin Guinebertière
Microsoft France

Ce message est fourni en l'état, sans garantie d'aucune sorte, et ne vous
confère aucun droit. Vous assumez tous les risques liés à son utilisation.



"Loubet" wrote in message
news:
>- Outils de développement utilisé : Visual Studio .NET 2003
> - Version du Framework .NET : 1.1
>
> Bonjour,
>
> Savez vous s'il est possible de faire de l'asynchrone en
> mode="StateServer"
> ? A priori non puisque mon projet fonctionne correctement quand je suis en
> mode="InProc" mais des fois que quelqu'un connaisse une astuce... En
> stateServer, tout est ok, sauf que mon EndInvoke ne met pas a jour ma
> variable de session.
>
> Si la reponse est non, savez vous si passer en asp 2.0 resoudrait mon
> problème ?
>
> Merci par avance,
>
> Loubet
>
> p.s : merci de ne pas disserter sur les mefaits ou les bienfaits de
> l'asynchrone, je cherche juste deseperement l'info.
>





Avatar
Benjamin Guinebertière [MS]
Je pense qu'il serait beaucoup plus sûr d'utiliser les mécanismes intégrés
dans reporting services.

En particulier, voici quelques points qui me semblent risqués avec la façon
dont vous procédez:
- vous utilisez un state server a priori pour une utilisation en ferme web.
Dans ce cas, si vous écrivez le fichier sur un des serveurs de la ferme et
que le navigateur revient sur l'autre serveur de la ferme, il ne verra pas
le fichier
- il faut bien faire attention aux droits lors de l'écriture d'un fichier
sur un serveur; On fait par exemple en général attention à ne jamais avoir
le droit décrire et d'exécuter au même endroit
- je ne vois pas le code faisant appel explicitement à session, mais si ce
code s'exécute dans un thread qui ne correspond pas à celui de la requête,
je ne suis pas sûr qu'ASP.NET puisse savoir à quelle session vous faites
référence.
- Que se passe-t-il quand la fin du traitement asynchrone arrive quand le
thread de requête a déjà fini de répondre?


--
Benjamin Guinebertière
Microsoft France

Ce message est fourni en l'état, sans garantie d'aucune sorte, et ne vous
confère aucun droit. Vous assumez tous les risques liés à son utilisation.




"Loubet" wrote in message
news:
Merci beaucoup de votre réponse !

1er precision importante, mon objet passé en session herite de la classe
ReportingService de MS. (Peut être suis trop gourmand ? cependant j'ai
testé
sans l'heritage, elle se resume donc a trois proprietes texte et 4
fonctions,
meme resultat...)
Elles est bien sur serializable et passe le test du vidage xml vers le
disque sans soucis quand je n'herite pas de ReportingService (suis pas
sur
que ce soit orthodoxe mais c'est ma technique, valable ?)

voici mes deux fonctions :

Public Function ExporterAsynchrone() As String

If pEnTraitement Then Exit Function
Try
pInitialisation = True
pEnTraitement = True
SyncLock Me
Dim oDelegate As New DelegueAjouter(AddressOf Exporter)
Dim oAsync As AsyncCallback = New AsyncCallback(AddressOf
ExporterAsynchroneFin)
Dim iAr As IAsyncResult = oDelegate.BeginInvoke(oAsync,
oDelegate)
End SyncLock
Return "Initialisation de l'impression réussie"
Catch ex As Exception
Return ex.Message
End Try

End Function

et

Private Sub ExporterAsynchroneFin(ByVal iAr As IAsyncResult)
pEnTraitement = False
SyncLock Me
Dim oDelegate As DelegueAjouter = CType(iAr.AsyncState,
DelegueAjouter)
oDelegate.EndInvoke(iAr)
End SyncLock
End Sub

ma variable est mise à jour dans la fonction Exporter, cad dans le
BeginInvoke.
precision : c'est ma fonction exporter qui lance le Render de
ReportingService, enregistre sur disque un pdf et répond en mettant à jour
le
chemin du fichier dans l'objet courant (ca precisement qui ne marche pas)

j'avoue ne pas avoir testé l'export asynchrone natif de ReportingService,
j'aurai voulu un avis eclairé avant de revoir ce dev qui est en production
depuis un moment.

concernant la discussion sur l'asynchronisme, sachant que je cherche à
lancer des reports tres lourds (plusieurs minutes) sans bloquer les
utilisateurs, je suis bien sur preneur de conseil avisé ! ;)

merci encore






"Benjamin Guinebertière [MS]" a écrit :

Le StateServer ne sert qu'à stocker la session. Il y a trois mode: Inproc
conserve les données de session dans la mémoire du serveur Web (cela ne
peut
donc pas fonctionner sur une ferme Web), StateServer conserve les données
de
session dans la mémoire d'un service Windows (le StateServer). Le
troisième
mode est le stockage des données de session dans SQL Server qui est le
cas
classique avec des fermes Web.

Par ailleurs, le principe sur lequel est conçu ASP.NET est qu'une requête
Web (de la réception du GET HTTP à l'envoi de la réponse) est traité dans
ASP.NET par un unique thread.
La méthode BeginInvoke exécute une méthode dans un autre thread (cf
http://msdn.microsoft.com/msdnmag/issues/04/06/BasicInstincts/ par
exemple
pour plus de détails).

Puvez-vous préciser comment la mise à jour de la variable de session est
effectuée (dans le thread de la requête ou dans le thread qui exécute la
méthode sur laquelle le BeginInvoke a lieu) et suivant quelle syntaxe?
Cela pourra nous aider je l'espère à répondre à votre question.

Par ailleurs, il est possible que la différence de comportement ne soit
pas
liée à l'asynchronisme, par exemple si vous stockez en session des
éléments
non sérialisables.
cf http://support.microsoft.com/default.aspx/kb/312112/en-us

Enfin, à votre demande, je ne disserte pas sur synchronisme et
asynchronisme
et les moyens d'implémenter cela !

--
Benjamin Guinebertière
Microsoft France

Ce message est fourni en l'état, sans garantie d'aucune sorte, et ne vous
confère aucun droit. Vous assumez tous les risques liés à son
utilisation.



"Loubet" wrote in message
news:
>- Outils de développement utilisé : Visual Studio .NET 2003
> - Version du Framework .NET : 1.1
>
> Bonjour,
>
> Savez vous s'il est possible de faire de l'asynchrone en
> mode="StateServer"
> ? A priori non puisque mon projet fonctionne correctement quand je suis
> en
> mode="InProc" mais des fois que quelqu'un connaisse une astuce... En
> stateServer, tout est ok, sauf que mon EndInvoke ne met pas a jour ma
> variable de session.
>
> Si la reponse est non, savez vous si passer en asp 2.0 resoudrait mon
> problème ?
>
> Merci par avance,
>
> Loubet
>
> p.s : merci de ne pas disserter sur les mefaits ou les bienfaits de
> l'asynchrone, je cherche juste deseperement l'info.
>







Avatar
Alain Rogister
j'ai exactement le même problème. J'essaye de changer le contenu d'une
variable de session dans un thread. ça fonctionne en mode InProc et pas en
StateServer, SQLServer. Je n'ai toujours pas à ce jour de réponse à ma
question. Or ça me pose un énorme problème dans la mesure où on a
régulièrement des pertes de session inexpliquée en mode InProc.

Avez-vous trouvé une solution ?

"Loubet" a écrit :

- Outils de développement utilisé : Visual Studio .NET 2003
- Version du Framework .NET : 1.1

Bonjour,

Savez vous s'il est possible de faire de l'asynchrone en mode="StateServer"
? A priori non puisque mon projet fonctionne correctement quand je suis en
mode="InProc" mais des fois que quelqu'un connaisse une astuce... En
stateServer, tout est ok, sauf que mon EndInvoke ne met pas a jour ma
variable de session.

Si la reponse est non, savez vous si passer en asp 2.0 resoudrait mon
problème ?

Merci par avance,

Loubet

p.s : merci de ne pas disserter sur les mefaits ou les bienfaits de
l'asynchrone, je cherche juste deseperement l'info.