2016-09-19 3 views
0

Angenommen, ich eine Klasse ähnlich wie diese haben (mit allen notwendigen WCF-Attribute):Kann ich einen Datenproduzenten von einem WCF-Dienst zurückgeben?

class JobProducer 
{ 
    Job Produce() 
    { 
     // Do some work 
     return new Job(params); 
    } 
} 

und einen WCF-Dienst (ich alle Attribute nicht zu schreiben, aber sie sind da)

class MyService : IService 
    { 
     Producer GetProducer() 
     { 
      return new Producer(); 
     }  
    } 

und ein WCF-Client:

IService client; 
var producer = client.GetProducer(); 
var job = producer.Produce(); 
while (job != null) 
{ 
    // Process job 
    job = producer.Produce(); 
} 

Wird diese Art von Design-Arbeit? Gibt es irgendwelche Nachteile, die ich beachten sollte?

Genauer gesagt, was passiert, wenn ich die Produce() Methode auf dem aufrufen? wird WCF diesen Methodenaufruf an den Dienst weiterleiten und den Client-Thread entsperren, wenn Job bereit ist?

Ich dachte über eine einfache Rückgabe eines Stream aus dem Dienst, aber ich möchte vermeiden, die Bytes zu einer konkreten Klasse deserialisieren und lassen Sie das Framework das für mich tun.

+1

WCF befasst sich mit bloßer Serialisierung. Sie senden Eigenschaften über den Draht, keine Instanzen. Sie suchen nach "Remoting" oder steuern ein Objekt, das auf einem Server von einem Client lebt. – CodeCaster

+0

@CodeCaster Bedeutet das, dass ich eine Methode auf etwas, das WCF zurückgibt, nicht aufrufen kann? – Shmoopy

+0

Sie können nicht, da generierte Klassen keine Methoden haben. Wenn Sie die DTO-Definitionen zwischen Dienst und Client freigeben, können Sie den Code auf dem Client ausführen. – CodeCaster

Antwort

1

Die Produce() - Methode für die lokale Instanz der Job-Klasse wird ausgeführt. Da Produce() kein Service-Endpunkt ist, werden keine Serveraufrufe getätigt. Die vom Service-Endpunkt zurückgegebene Instanz des Jobs wird nicht vom Server geleast, sondern vollständig unabhängig und, was noch wichtiger ist, nicht der gleiche Typ wie auf dem Server, sondern ein Serialisierungs-kompatibler Typ.

+0

Danke. Wie funktioniert die Rückgabe eines Streams aus einem Dienst mithilfe dieser Logik? Ich habe Beispiele gesehen, wo der Klient einen Strom vom Dienst bekommt und 'Read()' darauf – Shmoopy

+0

Thats weil es ein Strom ist. Standard WCF-Klassen sind Instanzen und können nicht teilweise von einem Server deserialisiert werden. Streams sind für die partielle Deserialisierung ausgelegt. Wenn Sie Async-Servermuster verwenden, können Sie dies auch für IEnumerable tun und dafür sorgen, dass es das erste Element im Enumerable ergibt, bevor es vom Server vorbereitet wurde - bis die gesamte Enumerable analysiert wird, bleibt eine Verbindung zwischen Client und Server bestehen . – PhillipH

Verwandte Themen