Ich bin auf ein Problem gestoßen, als ich versucht habe, das ServiceKnownType-Beispiel aus MSDN zu implementieren. In dem Beispiel werden die folgenden Klassen bereitgestellt:
[DataContract()]
public class Widget
{
[DataMember]
public string Id;
[DataMember]
public string Catalog;
}
[DataContract()]
public class Machine : Widget
{
[DataMember]
public string Maker;
}
Und die folgende Schnittstelle:
[ServiceKnownType(typeof(Widget))]
[ServiceKnownType(typeof(Machine))]
[ServiceContract()]
public interface ICatalog
{
[OperationContract]
Hashtable GetItems();
}
Das Problem ist, dass bei der Generierung der Proxy-Klasse (mit "Add Service Reference" / svcutil.exe) die "ServiceKnownType"-Attribute von der ICatalog-Proxy-Schnittstelle weggelassen werden, was zu einer Ausnahme führt "Der Formatierer hat beim Versuch, die Nachricht zu deserialisieren, eine Ausnahme ausgelöst: Fügen Sie den Typ, der 'Widget' entspricht, zur Liste der bekannten Typen hinzu" Um dieses Problem zu lösen, muss ich die bekannten Attribute des Dienstes manuell zur generierten Proxy-Schnittstelle hinzufügen, was eine sehr schlechte Lösung ist, da der Code neu generiert wird, wenn ich die Referenz aktualisiere. Das Interessante an dieser Situation ist, dass das Problem gelöst wäre, wenn die GetItems-Operation ein Objekt anstelle einer Hashtabelle zurückgeben oder ein Objekt als Parameter erhalten würde, d. h.
[OperationContract]
object GetItems();
ou
[OperationContract]
Hashtable GetItems(object obj);
führt zum Vorhandensein des Attributs "ServiceKnownType" auf der ICatalog-Proxy-Schnittstelle. Weiß jemand, wie man dieses Problem lösen kann?
Gracias