2010-12-13 13 views
0

Dies sollte ziemlich einfach sein, aber ich habe eine öffentliche Eigenschaft als lokale Variable in meinem WCF-Dienst, und ich habe dies in einem Aufruf an den Dienst festgelegt. Gibt es eine Möglichkeit, diese Daten für einen weiteren Aufruf des Dienstes zu erhalten? (Ohne die Daten in XML zu schreiben oder eine db, und Neureferenzierungs-er oder ähnliches)Erhalten Sie Objekte zwischen den Aufrufen?

Ausführen der Anrufe aus dem 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 

Der Service selbst (verdummt ein bisschen, aber das behaivor noch existiert):

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

Sieht so aus, als wenn ich den InstanceContextMode zu Single ändern würde, bleiben die Informationen zwischen den Anrufen bestehen. Danke euch allen. Wenn jemand gerne erklären würde, warum dies eine schlechte Idee ist, würde ich wirklich gerne wissen. Noch einmal Danke! StackOverflow ist ziemlich erstaunlich. – Kosko

+0

Zustand in Web-Services im Allgemeinen sollte vermieden werden. Sie müssen nun auch den Zugriff auf Ihren Status verriegeln, damit sich zwei Anrufe nicht gegenseitig überschreiben. –

+0

@John Saunders: Gibt es eine Chance, dass Sie einen Link haben, der weiter beschreibt, wie Sie den Zugriff sperren können? Ist es getan, indem der Code um by lock (this) {doStuff(); }, mit System.Threading.Interlock.Increment (Zähler); für Zähler und Vergleichen von Werten vor dem Überschreiben? – Kosko

Antwort

1

Wenn ich die Frage richtig verstehe, ist der Status Ihrer Dienst-Implementierung zwischen Dienstaufrufen verloren. Sie sollten in die Einstellung InstanceContextMode ServiceBehavior Ihrer Service-Implementierung schauen - es klingt, als wäre es derzeit auf PerCall eingestellt, so dass jeder Service-Aufruf seine eigene Instanz bekommt. PerSession oder Single können bessere Alternativen sein.

Und obwohl ich @John Saunders nicht unbedingt zustimme, dass dies eine schlechte Idee ist, wäre es nützlich, mehr Details darüber zu haben, was Sie erreichen möchten. :)

+0

Ich habe einen kleinen Code hinzugefügt, um zu verdeutlichen, was ich hier versuche. Es sieht so aus, als ob Sie die richtige Interpretation haben. Vielen Dank! – Kosko

+0

@Kosko Vielen Dank für die Ausarbeitung, aber wir werden wahrscheinlich die service-seitige Implementierung (d. H. Was auch immer die Eigenschaft enthält, die zwischen den Anrufen nicht besteht) betrachten, um eine Idee zu bekommen, was schief gehen könnte. Prost. –

1

Wenn Sie nur eine einzige Instanz des Service haben, dann können Sie Daten von einem Aufruf zum nächsten erhalten. Sie sollten überlegen, uns zu sagen, warum Sie dies tun wollen, da es sich wie eine schlechte Idee anhört.

+0

Vielen Dank für die schnelle Antwort. Es ist eine einzelne Instanz des Dienstes, aber beim zweiten Aufruf wird die Eigenschaft auf "Nothing" zurückgesetzt. Was die Argumentation betrifft, wäre der erste Aufruf, zu prüfen, ob Eigenschaften auf der Client-Seite gültig sind (wie eine Seriennummer), und den Dienst wissen zu lassen, mit welchem ​​Client er arbeitet. Die nächsten Anrufe wären das Abrufen von Informationen über diesen Client, grundlegende Informationen wie Name, Telefon, usw.) Ich könnte jedes Mal die Seriennummer übergeben, aber ich dachte, es wäre besser, das nur einmal zu passieren und andere Informationen nach Bedarf abrufen. – Kosko

+2

Woher wissen Sie, dass es sich um eine einzelne Instanz handelt? Möchten Sie Code anzeigen? –

+0

Einverstanden. Das klingt nicht richtig, ihr alle. :) –

Verwandte Themen