Wie geben Sie einen benutzerdefinierten Typ von einem WCF-Dienst zurück?

7

Ich habe einen WCF-Dienst in IIS gehostet. Die Absicht besteht darin, dass Clients einen Aufruf tätigen und eine benutzerdefinierte Klasse empfangen, die in einem anderen Projekt / DLL definiert ist. Ich habe einen Service-Client mit der svcutil.exe erstellt. Das Problem ist, dass dieser automatisch generierte Client eine neue Partial / Proxy-Definition für die Klasse enthält, die ich aus dem Service zurückzugeben versuche. Es löst jetzt einen Konvertierungsfehler zwischen meiner ursprünglichen benutzerdefinierten Klasse und der neuen partiellen Definition zum Zeitpunkt der Kompilierung aus. Wie also geben Sie benutzerdefinierte Typen von einem WCF-Dienst zurück? Rat geschätzt.

    
flesh 13.01.2009, 11:18
quelle

4 Antworten

4
___ qstnhdr ___ Wie geben Sie einen benutzerdefinierten Typ von einem WCF-Dienst zurück? ___ antwort438718 ___

Eines der Dinge, die auftreten müssen, ist, dass der Benutzer den Dienstverweis so konfigurieren muss, dass er Ihre Typen aus der DLL anstelle der durch den Proxy definierten Klasse verwendet - Ссылка

    
___ tag123net ___ Das .NET-Framework ist ein Software-Framework, das hauptsächlich für das Microsoft Windows-Betriebssystem entwickelt wurde. Es enthält eine Implementierung der Basisklassenbibliothek, Common Language Runtime (allgemein als CLR bezeichnet), Common Type System (allgemein als CTS bezeichnet) und Dynamic Language Runtime. Es unterstützt viele Programmiersprachen, einschließlich C #, VB.NET, F # und C ++ / CLI. NICHT für Fragen zu .NET Core verwenden. ___ answer438779 ___

Wenn der Typ, den Sie von Ihrem Serviceaufruf zurückgeben möchten, nicht als IFoo gekennzeichnet ist, können Sie ihn nicht aus WCF zurückgeben, ohne eine Kopie derselben Assembly für Ihre Clientanwendung bereitzustellen.

> %Vor%

Warum funktioniert der vorherige Code dann? Es funktioniert, weil beide Seiten des Serviceaufrufs IFoo haben, so dass beide über den Typ %code% Bescheid wissen, der der Rückgabetyp von OperationContract %code% ist.

Hier ist ein Beispiel mit %code% :

%Vor%

Nun haben Sie Serialisierungsattribute einer von Ihnen definierten Klasse ( %code% ) zur Verfügung gestellt. Dadurch können Sie mit %code% Proxy-Klassen in Ihrer Client-Anwendung erstellen, die serialisiert und an den WCF-Dienst gesendet werden / p>

Wenn Sie nun einen Typ zurückgeben möchten, der kein %code% ist, müssen Sie eine Kopie der Assembly, die diesen Typ enthält, Ihrer Client-Anwendung bereitstellen.

    
___ answer438756 ___

Wir sind diesen Weg in der Vergangenheit gegangen, und tatsächlich besteht das Problem darin, dass es sich natürlich um zwei verschiedene Klassen handelt. Daher müssen Sie dem von @Rich Reuter bereitgestellten Link folgen;

Wir haben jedoch auf die harte Tour gelernt, warum dies eine schlechte Praxis ist, da es sich um den dritten Grundsatz von SOA handelt: "Dienste teilen Schema und Vertrag, nicht Klasse".

Natürlich ist das Problem nicht nur, nicht einer "Regel" zu folgen, die irgendwann einmal von jemandem gestellt wurde, sondern dass es gute Gründe dafür gab - wir haben gelernt, dass der Preis für solch eine enge Verbindung zwischen der Dienstleistung und der client bedeutet, dass es sehr schwer ist, eine der beiden Versionen freizugeben. Wenn der Dienst ein anderes Feld zu dieser Klasse hinzufügen muss, um einen anderen Client zu bedienen, ist möglicherweise der erste Client betroffen. Wenn der Dienst dann etwas in dieser Klassendefinition ändern muss (um einen anderen Client zu bedienen) - der erste Client wird wieder betroffen sein und umgekehrt - kann der Client den Lebenszyklus des Dienstes beeinflussen.

In großen Projekten wird dies schnell zu einer großen Wartungslast.

    
___ tag123wcf ___ Windows Communication Foundation ist ein Teil von .NET Framework, das ein einheitliches Programmiermodell für die schnelle Erstellung von serviceorientierten Anwendungen bereitstellt. ___ tag123webservices ___ Ein "Web-Service" ist ein Softwaresystem, das Interoperabilität zwischen Maschine und Maschine über das World Wide Web unterstützt. ___ tag123userdefinedtypes ___ Benutzerdefinierter Typ (UDT) ist ein Typ, der vom Benutzer angepasst werden kann. Wird in Datenbankverwaltungssystemen auch als benutzerdefinierter Datentyp bezeichnet. Es wird normalerweise verwendet, um einige Integrationen vorzunehmen und Standards anzuwenden. Einige verwandte Systeme sind SQL Server, Oracle, PostgreSQL, C ++, Visual Basic und usw. ___ qstntxt ___

Ich habe einen WCF-Dienst in IIS gehostet. Die Absicht besteht darin, dass Clients einen Aufruf tätigen und eine benutzerdefinierte Klasse empfangen, die in einem anderen Projekt / DLL definiert ist. Ich habe einen Service-Client mit der svcutil.exe erstellt. Das Problem ist, dass dieser automatisch generierte Client eine neue Partial / Proxy-Definition für die Klasse enthält, die ich aus dem Service zurückzugeben versuche. Es löst jetzt einen Konvertierungsfehler zwischen meiner ursprünglichen benutzerdefinierten Klasse und der neuen partiellen Definition zum Zeitpunkt der Kompilierung aus. Wie also geben Sie benutzerdefinierte Typen von einem WCF-Dienst zurück? Rat geschätzt.

    
___ antwort438778 ___

Nur an zweiter Stelle Yossis / Richs Gedanken:

  • Ja, Sie können der gemeinsam genutzten DLL einen Verweis hinzufügen (anstatt die generierte Proxy-Klasse zu verwenden)
  • Ja, es verhindert viele der Absichten von Datenverträgen, und wenn irgendeine Art von benutzerdefinierter Serialisierung stattfindet, haben Sie möglicherweise Probleme, Ihren Service zu erweitern

Ich bin schon vorher diesen Weg gegangen und wünschte mir irgendwie, ich hätte es nicht getan. Re Erweiterbarkeit / benutzerdefinierte Serialisierung - Sie müssen sehr vorsichtig sein. Etwas einfacher, wenn Sie einen vorgerollten Serializer wie protobuf-net verwenden (der direkt in WCF integriert werden kann) , und das ist mit Erweiterbarkeit im Auge), aber nicht einfach.

Tatsächlich ist ein Vorteil , die Klassen zu teilen, dass es ein bisschen einfacher zu testen ist: Da Sie überall die gleiche %code% haben, können Sie diese %code% mit einer vernünftigen Wahrscheinlichkeit von Erfolg. Es ist schwieriger zu verspotten, wenn der Proxy eingebunden wird (wenn Sie mehr bewegliche Teile zwischen dem Testcode und dem Produktionscode ändern).

    
___
Marc Gravell 13.01.2009, 12:21
quelle
10

Wenn der Typ, den Sie von Ihrem Serviceaufruf zurückgeben möchten, nicht als DataContract gekennzeichnet ist, können Sie ihn nicht aus WCF zurückgeben, ohne eine Kopie derselben Assembly für Ihre Clientanwendung bereitzustellen.

> %Vor%

Warum funktioniert der vorherige Code dann? Es funktioniert, weil beide Seiten des Serviceaufrufs System.dll haben, so dass beide über den Typ System.TimeSpan Bescheid wissen, der der Rückgabetyp von OperationContract GetTimeSpan() ist.

Hier ist ein Beispiel mit DataContract :

%Vor%

Nun haben Sie Serialisierungsattribute einer von Ihnen definierten Klasse ( Contract ) zur Verfügung gestellt. Dadurch können Sie mit svcutil.exe Proxy-Klassen in Ihrer Client-Anwendung erstellen, die serialisiert und an den WCF-Dienst gesendet werden / p>

Wenn Sie nun einen Typ zurückgeben möchten, der kein DataContract ist, müssen Sie eine Kopie der Assembly, die diesen Typ enthält, Ihrer Client-Anwendung bereitstellen.

    
Andrew Hare 13.01.2009 12:22
quelle
4
___ qstnhdr ___ Wie geben Sie einen benutzerdefinierten Typ von einem WCF-Dienst zurück? ___ antwort438718 ___

Eines der Dinge, die auftreten müssen, ist, dass der Benutzer den Dienstverweis so konfigurieren muss, dass er Ihre Typen aus der DLL anstelle der durch den Proxy definierten Klasse verwendet - Ссылка

    
___ tag123net ___ Das .NET-Framework ist ein Software-Framework, das hauptsächlich für das Microsoft Windows-Betriebssystem entwickelt wurde. Es enthält eine Implementierung der Basisklassenbibliothek, Common Language Runtime (allgemein als CLR bezeichnet), Common Type System (allgemein als CTS bezeichnet) und Dynamic Language Runtime. Es unterstützt viele Programmiersprachen, einschließlich C #, VB.NET, F # und C ++ / CLI. NICHT für Fragen zu .NET Core verwenden. ___ answer438779 ___

Wenn der Typ, den Sie von Ihrem Serviceaufruf zurückgeben möchten, nicht als %code% gekennzeichnet ist, können Sie ihn nicht aus WCF zurückgeben, ohne eine Kopie derselben Assembly für Ihre Clientanwendung bereitzustellen.

> %Vor%

Warum funktioniert der vorherige Code dann? Es funktioniert, weil beide Seiten des Serviceaufrufs %code% haben, so dass beide über den Typ %code% Bescheid wissen, der der Rückgabetyp von OperationContract %code% ist.

Hier ist ein Beispiel mit %code% :

%Vor%

Nun haben Sie Serialisierungsattribute einer von Ihnen definierten Klasse ( %code% ) zur Verfügung gestellt. Dadurch können Sie mit %code% Proxy-Klassen in Ihrer Client-Anwendung erstellen, die serialisiert und an den WCF-Dienst gesendet werden / p>

Wenn Sie nun einen Typ zurückgeben möchten, der kein %code% ist, müssen Sie eine Kopie der Assembly, die diesen Typ enthält, Ihrer Client-Anwendung bereitstellen.

    
___ answer438756 ___

Wir sind diesen Weg in der Vergangenheit gegangen, und tatsächlich besteht das Problem darin, dass es sich natürlich um zwei verschiedene Klassen handelt. Daher müssen Sie dem von @Rich Reuter bereitgestellten Link folgen;

Wir haben jedoch auf die harte Tour gelernt, warum dies eine schlechte Praxis ist, da es sich um den dritten Grundsatz von SOA handelt: "Dienste teilen Schema und Vertrag, nicht Klasse".

Natürlich ist das Problem nicht nur, nicht einer "Regel" zu folgen, die irgendwann einmal von jemandem gestellt wurde, sondern dass es gute Gründe dafür gab - wir haben gelernt, dass der Preis für solch eine enge Verbindung zwischen der Dienstleistung und der client bedeutet, dass es sehr schwer ist, eine der beiden Versionen freizugeben. Wenn der Dienst ein anderes Feld zu dieser Klasse hinzufügen muss, um einen anderen Client zu bedienen, ist möglicherweise der erste Client betroffen. Wenn der Dienst dann etwas in dieser Klassendefinition ändern muss (um einen anderen Client zu bedienen) - der erste Client wird wieder betroffen sein und umgekehrt - kann der Client den Lebenszyklus des Dienstes beeinflussen.

In großen Projekten wird dies schnell zu einer großen Wartungslast.

    
___ tag123wcf ___ Windows Communication Foundation ist ein Teil von .NET Framework, das ein einheitliches Programmiermodell für die schnelle Erstellung von serviceorientierten Anwendungen bereitstellt. ___ tag123webservices ___ Ein "Web-Service" ist ein Softwaresystem, das Interoperabilität zwischen Maschine und Maschine über das World Wide Web unterstützt. ___ tag123userdefinedtypes ___ Benutzerdefinierter Typ (UDT) ist ein Typ, der vom Benutzer angepasst werden kann. Wird in Datenbankverwaltungssystemen auch als benutzerdefinierter Datentyp bezeichnet. Es wird normalerweise verwendet, um einige Integrationen vorzunehmen und Standards anzuwenden. Einige verwandte Systeme sind SQL Server, Oracle, PostgreSQL, C ++, Visual Basic und usw. ___ qstntxt ___

Ich habe einen WCF-Dienst in IIS gehostet. Die Absicht besteht darin, dass Clients einen Aufruf tätigen und eine benutzerdefinierte Klasse empfangen, die in einem anderen Projekt / DLL definiert ist. Ich habe einen Service-Client mit der svcutil.exe erstellt. Das Problem ist, dass dieser automatisch generierte Client eine neue Partial / Proxy-Definition für die Klasse enthält, die ich aus dem Service zurückzugeben versuche. Es löst jetzt einen Konvertierungsfehler zwischen meiner ursprünglichen benutzerdefinierten Klasse und der neuen partiellen Definition zum Zeitpunkt der Kompilierung aus. Wie also geben Sie benutzerdefinierte Typen von einem WCF-Dienst zurück? Rat geschätzt.

    
___ antwort438778 ___

Nur an zweiter Stelle Yossis / Richs Gedanken:

  • Ja, Sie können der gemeinsam genutzten DLL einen Verweis hinzufügen (anstatt die generierte Proxy-Klasse zu verwenden)
  • Ja, es verhindert viele der Absichten von Datenverträgen, und wenn irgendeine Art von benutzerdefinierter Serialisierung stattfindet, haben Sie möglicherweise Probleme, Ihren Service zu erweitern

Ich bin schon vorher diesen Weg gegangen und wünschte mir irgendwie, ich hätte es nicht getan. Re Erweiterbarkeit / benutzerdefinierte Serialisierung - Sie müssen sehr vorsichtig sein. Etwas einfacher, wenn Sie einen vorgerollten Serializer wie protobuf-net verwenden (der direkt in WCF integriert werden kann) , und das ist mit Erweiterbarkeit im Auge), aber nicht einfach.

Tatsächlich ist ein Vorteil , die Klassen zu teilen, dass es ein bisschen einfacher zu testen ist: Da Sie überall die gleiche %code% haben, können Sie diese %code% mit einer vernünftigen Wahrscheinlichkeit von Erfolg. Es ist schwieriger zu verspotten, wenn der Proxy eingebunden wird (wenn Sie mehr bewegliche Teile zwischen dem Testcode und dem Produktionscode ändern).

    
___
Rich Reuter 13.01.2009 11:43
quelle
4

Wir sind diesen Weg in der Vergangenheit gegangen, und tatsächlich besteht das Problem darin, dass es sich natürlich um zwei verschiedene Klassen handelt. Daher müssen Sie dem von @Rich Reuter bereitgestellten Link folgen;

Wir haben jedoch auf die harte Tour gelernt, warum dies eine schlechte Praxis ist, da es sich um den dritten Grundsatz von SOA handelt: "Dienste teilen Schema und Vertrag, nicht Klasse".

Natürlich ist das Problem nicht nur, nicht einer "Regel" zu folgen, die irgendwann einmal von jemandem gestellt wurde, sondern dass es gute Gründe dafür gab - wir haben gelernt, dass der Preis für solch eine enge Verbindung zwischen der Dienstleistung und der client bedeutet, dass es sehr schwer ist, eine der beiden Versionen freizugeben. Wenn der Dienst ein anderes Feld zu dieser Klasse hinzufügen muss, um einen anderen Client zu bedienen, ist möglicherweise der erste Client betroffen. Wenn der Dienst dann etwas in dieser Klassendefinition ändern muss (um einen anderen Client zu bedienen) - der erste Client wird wieder betroffen sein und umgekehrt - kann der Client den Lebenszyklus des Dienstes beeinflussen.

In großen Projekten wird dies schnell zu einer großen Wartungslast.

    
Yossi Dahan 13.01.2009 12:06
quelle