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 - Ссылка
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.
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 - Ссылка
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.
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.
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.
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.
Nur an zweiter Stelle Yossis / Richs Gedanken:
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).
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.
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
:
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.
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 - Ссылка
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.
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.
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.
Nur an zweiter Stelle Yossis / Richs Gedanken:
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).
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.
Tags und Links wcf .net web-services user-defined-types