Laden...

Dienstverweis und Wiederverwendung vom Assemblys

Erstellt von Tam0r vor 8 Jahren Letzter Beitrag vor 8 Jahren 2.159 Views
T
Tam0r Themenstarter:in
137 Beiträge seit 2008
vor 8 Jahren
Dienstverweis und Wiederverwendung vom Assemblys

Hallo Gemeinde,

ich habe folgendes Problem:

Ich biete mit ASP.net einen WebService an. In diesem Web-Projekt ist eine weitere Projektmappe eingebunden. Diese stellt eine Klasse bereit die XYZ.Daten.Klassenname lautet.

Ich habe nun in meiner C# Formsanwendung diese Projektmappe ebenfalls eingebunden. Desweiteren habe ich oben bereitgestellten Webservice als Dienstverweis eingebunden. Beim generieren ist standardmäßig eingestellt
"Typen in allen Assemblys, auf die verwiesen wird, wiederverwenden."

Obwohl dies eingestellt ist bietet die Klasse vom Webservice als Rückgabe wert den Typ MYWebService.Klassenname.

Ich habe gegooglte und immer nur die Info bekommen das die oben genannte Einstellung gesetzt werden muss. Dies ist aber schon von Haus aus eingestellt gewesen.

Da es sich um die gleiche Projektmappe handelt kann es ja auch nicht sein das es einen Fehler bei der benennung der Assembly gibt.

Gibt es sonst irgendwas was ich beachten muss ? Ich bin für jeden Hinweis dankbar.

MfG

Tamer

T
708 Beiträge seit 2008
vor 8 Jahren

Hallo Tam0r,

ich wüsste nicht dass das geht. Denn genau wie Du beschreibst, wird das Webservice-Objekt immer aus dem Referenznamen gebildet.
Nur so wäre es auch möglich zweimal den selben Webservice einzubinden.
In diesem Fall, würde die Klasse aber nicht erneut gebildet, da diese in der ersten Referenz schon vorhanden ist.

Dass "irgendwo" in einer anderen Projektmappe dieses Klasse ebenfalls schon vorhanden ist, kann VS, bzw. die svcutil nicht erkennen.

Alternativ kannst Du natürlich Deine Klasse selbst serialisieren und den WebRequest manuell versenden. Also komplett ohne Referenz/Dienstverweis arbeiten.

T
Tam0r Themenstarter:in
137 Beiträge seit 2008
vor 8 Jahren

Hallo trib,

danke für deine Antwort. Laut Microsoft ist diese Funktion genau dafür gedacht. Wenn ich mit dem WebService ein DataTable Objekt zurückgebe ist der Typ auch nicht MyWebService.DataTable sondern eben aus dem Namenspace von MS. Ich kann somit auf alle Methoden zugreifen in dieser Klasse.

Das Problem bei mir ist das er nicht erkennt das es sich um die selbe Assembly handelt...

16.806 Beiträge seit 2008
vor 8 Jahren

Wo genau sagt das Microsoft?
Mir wäre neu, dass dieser Dialog dafür da ist, den Namespace einer bestehenden Sache zu übernehmen.

Meines Wissens gibt es genau zwei Möglichkeiten:

  • automatische Generierung des Namespaces anhand der Informationen durch den Server
  • Eingabe einer eigenen Bezeichnung des Namespaces

Auch in der Dokumentation steht nichts dazu, dass der Namespace einer Assembly dazu ermittelt wird.

T
Tam0r Themenstarter:in
137 Beiträge seit 2008
vor 8 Jahren

Laut diesem Artikel ist die Einstellung

Typen in allen Assemblys, auf die verwiesen wird, wiederverwenden

genau dafür gedacht.

Wenn einem Projekt ein Dienstverweis hinzugefügt wird, werden alle in dem Dienst definierten Typen im lokalen Projekt generiert. In vielen Fällen werden dabei doppelte Typen erstellt, wenn ein Dienst gebräuchliche .NET Framework-Typen verwendet oder wenn Typen in einer gemeinsam genutzten Bibliothek definiert sind.

Um dieses Problem zu vermeiden, werden Typen in referenzierten Assemblys standardmäßig freigegeben. Wenn Sie die Typfreigabe für eine oder mehrere Assemblys deaktivieren möchten, können Sie dies im Dialogfeld Dienstverweis konfigurieren durchführen.

Hier der Link zum Artikel

16.806 Beiträge seit 2008
vor 8 Jahren

Ich weiß jetzt nicht, ob sich das Verhalten geändert hat, aber die Dokumentation, die Du zitierst, gilt offensichtlich für VS2010.
Ob das nun so Absicht in der Doku ist oder das in 2015 gleich sein sollte: keinen Schimmer.
Ehrlich gesagt erkenn ich aus der Doku jetzt auch nicht, dass hier wirklich von einer eigenen Dritt-Assembly die Rede sein soll.
Mit "freigeben" könnte genauso gemeint sein, dass die generierten Klassen eben public sind oder irgendwo gemeinsam abgelegt werden; aber irgendwie nicht, dass was eigenes verwendet wird.

Das Verhalten, das Du beschreibst bzw wünschst, kenne ich ehrlich gesagt so nicht - will aber auch nicht ausschließen, dass das mal so war oder doch irgendwie noch so ist.

2.298 Beiträge seit 2010
vor 8 Jahren

Hallo,

ich wage mich zu erinnern, dass ich ebenfalls mal ein Projekt erstellt habe in denen ich Schnittstellentypen (Webservice, Client) in eine eigene Assembly ausgelagert habe und diese Typen nicht im Proxy generiert wurden.

In Visual Studio 2010 bekomme ich dies aber ebenfalls nicht mehr hin (gerade einmal probiert).

Einziges was ich tun konnte, was aber sehr Aufwendig ist, war im Proxy die generierten Typen zu entfernen. - Anschließend wurden die aus der gemeinsamen Assembly verwendet.

Ich kann aber auch nichts darüber finden, ob an der Stelle mal was geändert wurde.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

T
Tam0r Themenstarter:in
137 Beiträge seit 2008
vor 8 Jahren

Hallo inflames2k,Abt,

danke für deine Antwort. Leider wäre dies keine Option da der Proxy immer wieder neugebaut wird und das wäre sehr Aufwendig dies jedesmall zu korrigieren. Kann es sich dabei um einen BUG handeln? Weil die Funktion ja schonmal funktioniert haben muss.

Es wäre sehr nützlich wenn die funktion funktionieren würde.

@Abt

danke für deine Antwort.Ich gebe zu die Übersetzung ist nicht die beste ins deutsche. Aber ich denke die Aussage

...gemeinsam genutzten Bibliothek definiert sind.

bezieht sich schon auf eigene Assemblys bzw. auf fremde. Die Funktion wäre schon sehr sinnvoll und nützlich. Ich denke auf dieser Basis funktioniert es auch das ich ein System.Data.DataTable verschicken kann und anschließend auf die Methoden zugreifen kann.