2010-12-13 33 views
0

Cela devrait être assez basique, mais disons que j'ai une propriété publique en tant que variable locale sur mon service WCF, et je l'ai défini en un seul appel au service. Existe-t-il un moyen de conserver ces données pour un autre appel au service? (Sans écrire les données XML ou un db, et re-référencement ou quelque chose comme ça)Préserver les objets entre les appels wcf?

L'exécution des appels de la Winform:

Public Class ClientSideWinForm 

    Private proxy As ServiceReference.Client 

    Private Sub Client_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     proxy = New ServiceReference.Client 
    End Sub 

    Private Sub btnStartTests_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStartTests.Click 
     addToTxtResults("Try Chk Program Valid...") 
     Try 
      addToTxtResults(proxy.RequestChkValidProgram("Some-serial-number")) 'returns true or false and instanciates the object server side 

      addToTxtResults(proxy.RequestFirstName()) ' returns nothing 
     Catch ex As Exception 
      addToTxtResults(ex.ToString) 
     End Try 
    End Sub 
End Class 

Le service lui-même (abêtis un peu, mais la behaivor existe toujours):

Public Class Service 
    Implements IService 

Public Property X As String 

Function RequestChkValidProgram(ByVal strSerialNumber As String) As Integer Implements IService.RequestChkValidProgram 
     X = "hello" 
End Function 

Function RequestFirstName() As String Implements IService.RequestFirstName 
    Return X 
End Function 

End Class 
+0

On dirait que si je change le InstanceContextMode en Single, l'information persiste entre les appels. Merci tout le monde. Si quelqu'un voudrait expliquer pourquoi c'est peut-être une mauvaise idée, j'aimerais vraiment le savoir. Merci encore! StackOverflow est assez incroyable. – Kosko

+0

l'état dans les services Web, en général, devrait être évité. Vous devez également maintenant verrouiller l'accès à votre état afin que deux appels ne se remplacent pas l'un l'autre. –

+0

@John Saunders: avez-vous un lien qui décrit plus en détail comment verrouiller l'accès? Est-ce fait en enveloppant le code avec lock (this) {doStuff(); }, en utilisant System.Threading.Interlock.Increment (compteur); pour les compteurs, et en comparant les valeurs avant de les écraser? – Kosko

Répondre

1

Si je comprends bien la question, l'état de votre implémentation de service est perdu entre les appels de service. Vous devriez regarder dans la configuration du InstanceContextMode ServiceBehavior de votre implémentation de service - il semble que ce soit actuellement PerCall, de sorte que chaque appel de service obtient sa propre instance. PerSession ou Single peuvent être de meilleures alternatives.

Et bien que je ne sois pas nécessairement d'accord avec @ John Saunders pour dire que c'est une mauvaise idée, il serait utile d'avoir plus de détails sur ce que vous essayez d'accomplir. :)

+0

J'ai ajouté un petit code pour essayer de clarifier ce que j'essaie de faire ici. Il semble que vous ayez la bonne interprétation. Merci! – Kosko

+0

@Kosko Merci pour l'élaboration, mais nous aurons probablement besoin de jeter un coup d'œil sur l'implémentation côté service (c'est-à-dire sur la propriété qui ne persiste pas entre les appels) pour avoir une idée de ce qui pourrait mal tourner. À votre santé. –

1

Si vous avez seulement une seule instance de votre service, vous pouvez conserver les données d'un appel à l'autre. Vous devriez envisager de nous dire pourquoi vous voulez faire cela, car cela semble être une mauvaise idée.

+0

Merci pour la réponse rapide. Il s'agit d'une instance unique du service, mais lors du deuxième appel, la propriété est définie sur "Nothing". En ce qui concerne le raisonnement, le premier appel consiste à vérifier si les propriétés du côté client sont valides (comme un numéro de série) et à informer le service du client avec lequel il travaille. Les prochains appels consisteraient à récupérer des informations à propos de ce client, des informations de base telles que le nom, le téléphone, etc.) Je pourrais transmettre le numéro de série à chaque fois, mais je pensais qu'il serait préférable de ne passer qu'une seule fois , et prenez d'autres informations selon vos besoins. – Kosko

+2

Comment savez-vous que c'est une instance unique? Vous voulez montrer du code? –

+0

D'accord. Ça ne sonne pas bien, d'accord. :) –