2009-12-24 9 views
6

Ich habe kürzlich einen WCF-Dienst zu sehen, der Betriebsverträge mit durch ref Argumente erklärt.Sind "by ref" Argumente in WCF schlecht oder gut?

Ich weiß nicht, warum diese Designentscheidung getroffen wurde (Operationen sind ungültig), aber darüber hinaus bin ich nicht in der Lage - aus meiner WCF-Kenntnis - zu sagen, ob dies eine gute Praxis ist oder nicht. Oder wenn das nicht relevant ist.

Was denkst du?

Antwort

4

WCF ist nicht eine "remote object call" -Methode oder irgendetwas - es ist reine Nachricht-Weitergabe. So könnte ein "by-ref" -Parameter kompilieren, aber es wird wirklich nichts nützliches machen.

Auf Ihrem Client haben Sie eine Methode mit Parametern, die Sie aufrufen. Die WCF-Laufzeit fängt dann diesen Aufruf ab, verpackt die Parameter und alle weiteren erforderlichen Informationen in eine Nachricht, serialisiert diese Nachricht (in textuelles oder binäres XML) und sendet diese Nachricht über die Verbindung an den Server.

Der Server deserialisiert die Nachrichten dann wieder in eine Reihe von Parametern und die Dispatcher-Komponente auf dem Server instanziiert dann die Serviceklasse und ruft die entsprechende Methode für diese Serviceklasseninstanz mit den Parametern aus der Nachricht auf.

Die ganze Geschichte funktioniert rückwärts für die Antwort, die der Server zurücksendet.

Aber noch einmal: alles, was Sie zwischen Client und Server sind Austausch ist eine serialisiert Nachricht - es gibt absolut keinen Sinn, einen Parameter „von ref“ zu machen - es kann unmöglich ein Neben ref Parameter sein, am Ende. Der Server und der Client sind völlig getrennte Welten, völlig getrennte Objekte und Klassen - sie sehen auf der Leitung gleich aus.

Also ich denke, wer auch immer schrieb, dass WCF-Methode nicht die Prinzipien der WCF-Nachricht zu verstehen, wurde aber von der Art und Weise wie WCF fühlt gelockt - wie nur ein Methodenaufruf. Aber es ist wirklich nicht nur ein Methodenaufruf am Ende.

+4

Das ist genau, dachte ich. Und nach deiner Antwort habe ich beschlossen, einen Test zu machen. Klingt komisch, aber die WCF-Infrastruktur verarbeitet die by ref: Wenn der Dienst Änderungen an dem by ref-Argument vornimmt, spiegelt das übergebene Argument diese Änderungen wider, nachdem der Aufruf an den Client zurückgegeben wurde. – MatteoSp

+0

@MatteoSp: das ist sehr interessant zu hören! Ich habe mich nie darum gekümmert, da ich von allem, was ich wusste, überzeugt war, dass es nie funktionieren würde - versuch es besser selbst! :-) Noch stellt sich die Frage, ob es wirklich eine gute Idee ist, aber ... –

+3

@marc_s Ein bisschen spät, aber, WCF ist standardmäßig RPC-Stil. Schließlich rufen wir eine Methode für ein Objekt (Proxy) auf und die Methode läuft auf einem Server. Um den "Nachrichten" -Stil zu verwenden, müssen wir Nachrichtenverträge verwenden, die uns die volle Kontrolle über die SOAP-Nachricht geben. – thewpfguy

5

jedoch Gemäß diesem Microsoft-Artikel eines WCF Aufruf verhält sich genau wie ein Remote Procedure Call und ByRef Argumente verwendet werden können, um Daten zurückzugeben: -

http://msdn.microsoft.com/en-us/library/ms733070.aspx

Siehe den Abschnitt: Out und Ref-Parameter

in den meisten Fällen können Sie in Parameter (ByVal in Visual Basic) und und ref-Parameter (ByRef in Visual Basic) verwenden. Da sowohl out- als auch ref-Parameter angeben, dass Daten von einem Vorgang zurückgegeben werden, gibt eine Betriebssignatur wie die folgende an, dass ein Anfrage-/Antwortvorgang erforderlich ist, obwohl die Signatur void zurückgibt.

1

Ich bin mit Marc_s.

müssen Sie sehr vorsichtig sein.

WCF wird immer eine neue Instanz dieses Objekts zuweisen, nicht nur den Inhalt ändern.

Wie mars_s bereits erklärt wurde, ist wcf ein Messaging-Framework. Seine Natur besteht darin, unabhängige Nachrichten zu senden und zu empfangen.

Ich denke, es ist eine gute Übung, immer eine In-/und eine Out-Nachricht zu definieren. Ihre sericve-Schnittstelle wird einfacher zu verstehen und zu pflegen sein.

Methoden mit Ref- und Out-Parametern sind immer sehr hässlich und schwer zu verstehen.

Verwandte Themen