Frage

Ich habe einen WCF-Dienst in IIS gehostet. Die Absicht ist, für die Kunden einen Anruf zu tätigen und eine benutzerdefinierte Klasse erhalten, die in einem anderen Projekt / dll definiert ist. Ich habe ein Service-Client mit dem svcutil.exe erzeugt. Das Problem ist, diese automatisch generiert Client eine neuen Teil / Proxy-Definition für die Klasse I enthält, aus dem Dienst zurückzukehren versuchen. Es wirft nun einen Konvertierungsfehler zwischen meiner ursprünglichen benutzerdefinierten Klasse und die neuen Teildefinition bei der Kompilierung. So wie Sie kehren Sie benutzerdefinierte Typen aus einem WCF-Dienst? Beratung sehr geschätzt.

War es hilfreich?

Lösung

Nur um zweite Yossi des / Richs Gedanken:

  • ja, können Sie einen Verweis auf den gemeinsam genutzten DLL (anstatt der generierte Proxy-Klasse)
  • hinzufügen
  • ja, es besiegt viel von der Absicht der Daten-Verträge, und wenn irgendeine Art von benutzerdefinierten Serialisierung geschieht, können Sie haben Fragen Ihren Service erstreckt

Ich habe vor diesem Weg gegangen, und in gewisser Weise wünschte, ich hätte es nicht. Re-Erweiterbarkeit / benutzerdefinierte Serialisierung - man muss sein sehr vorsichtig. Ein bisschen einfacher, wenn Sie eine vorgewalzte Serializer verwenden wie protobuf-net ( die direkt in WCF integrieren können und die im Sinne der Erweiterungs) ausgelegt ist, aber nicht einfach.

Eigentlich ein Vorteil: , um die Klassen zu teilen ist, dass es es ein bisschen leichter zu Test macht: Da Sie die gleiche IFoo überall haben, können Sie diese IFoo mit Aussicht auf Erfolg spotten kann. Es ist schwieriger zu spotten, wenn die Proxy-einlässt (wie Sie mehr bewegliche Teile zwischen dem Testcode und dem Produktionscode ändern).

Andere Tipps

Wenn die Art, die Sie von Ihrem Service-Aufruf zurückkehren mögen nicht als DataContract markiert, dann werden Sie nicht in der Lage sein, es von WCF zurückzukehren, ohne eine Kopie der gleichen Baugruppe zu dem Client-Anwendung bereitgestellt wird.

using System;
using System.ServiceModel;

[ServiceContract]
interface IService
{
    [OperationContract]
    TimeSpan GetTimeSpan();
}

class Service : IService
{
    public TimeSpan GetTimeSpan() { return DateTime.Now.TimeOfDay; }
}

Warum die vorherigen Code Arbeit dann? Es funktioniert, weil beide Seiten des Serviceabrufs System.dll haben, so dass sie beide über den System.TimeSpan Typen wissen, die der Rückgabetyp der Operation GetTimeSpan() ist.

Hier ist ein Beispiel einer DataContract mit:

using System;
using System.ServiceModel;
using System.Runtime.Serialization;

[ServiceContract]
interface IService
{
    [OperationContract]
    Contract GetContract();
}

[DataContract]
class Contract
{
    [DataMember]
    public String MyProperty { get; set; }
}

class Service : IService
{
    public Contract GetContract() { return new Contract(); }
}

Jetzt haben Sie zur Verfügung gestellt Serialisierung einer Klasse Attribute, die Sie definiert haben (Contract.) - dies ermöglicht es Ihnen svcutil.exe verwenden Proxy-Klassen in der Client-Anwendung zu erstellen, die serialisiert werden und an den WCF-Dienst gesendet

Nun, wenn Sie einen Typ zurückgeben möchten, kein DataContract ist eine Kopie der Baugruppe zur Verfügung stellen muss, die Art zu Ihrer Client-Anwendung enthält.

Eines der Dinge, die passieren müssen, ist, dass der Benutzer den Dienstverweis konfigurieren müssen Ihre Typen aus der DLL zu verwenden, anstatt die Klasse durch den Proxy definiert - http://msdn.microsoft.com/en-us/library/bb628653.aspx

Wir haben diesen Weg in der Vergangenheit gingen nach unten, und in der Tat das Problem ist, dass, natürlich, das sind zwei verschiedene Klassen, so finden Sie den Link zur Verfügung gestellt von @Rich Reuter folgen müssen;

Wir haben gelernt, aber die harte Weise, warum diese schlechte Praxis ist, wie es agains der 3. Grundsatz der SOA- „Services Aktie Schemas und zusammenziehen, nicht Klasse“ geht.

Natürlich ist das Problem nicht nur nicht nach einer „Regel“ festlegen, indem jemand an einem gewissen Punkt, aber, dass es für diese gute Gründe waren vorgeschlagen zu werden - wir haben gelernt, dass der Preis dieser engen Kopplung zwischen dem Dienst und der Client bedeutet, dass es sehr schwer ist, entweder zu veröffentlichen - wenn der Dienst ein anderes Feld zu dieser Klasse hinzufügen muss, einen anderen Client zu bedienen - der erste Client betroffen sein könnten; wenn der Dienst als Bedürfnisse etwas in dieser Klassendefinition ändern (um einen anderen Client Service) - der erste Client wieder betroffen sein, und umgekehrt - der Kunde kann den Lebenszyklus des Dienstes beeinträchtigen.

In großen Projekten wird dies schnell zu einem großen Wartungsaufwand.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top