Domanda

Sto avendo un po 'di difficoltà a capire ServiceKnownType in WCF.

questo blog , il seguente codice non funziona:

[DataContract(Namespace = “http://mycompany.com/”)]
public class Shape{…}

[DataContract(Namespace = “http://mycompany.com/”)]
public class Circle : Shape {…}

[ServiceContract]
public interface IMyServer
{
    [OperationContract]
    bool AddShape(Shape shape);
}

.

IMyServer client = new ChannelFactory<IMyServer>(binding, endPoint).CreateChannel();

client.AddShape(new Circle());

Il motivo per cui non funziona è perché si sta tentando di aggiungere un cerchio, ma il ServiceContract permette solo una forma. Si suppone di fare qualcosa con knowntypes, ma io sono un po 'confuso su come funziona.

Dato che il codice è al servizio, perché non si sa automaticamente che un cerchio è derivato da Shape? Inoltre, che cosa fa ServiceKnownType effettivamente fare?

Quando ServiceKnownType viene messo sotto la DataContract, a quanto pare che lo fa funzionare. Sto indovinando che dice hey, questo particolare tipo di oggetto chiamato Shape può anche essere un cerchio. Sto avendo difficoltà a capire il motivo per cui dovrebbe fare in questo modo intorno, perché se si aggiunge un nuovo tipo come Piazza che si sta andando ad avere per aggiungere alla classe Shape un ServiceKnownType per esso. Non avrebbe senso se non si può dedurre che, per mettere il KnownType sulla piazza, piuttosto che la forma? Così dice la Piazza hey, io sono una forma, e tu non avere a giocherellare con la classe Shape? Se la classe Shape è costruito in una libreria e si desidera creare la propria forma dervied come DiamondShape, non è possibile aggiungere alla classe Shape, perché non si dispone di accesso al codice sorgente.

È stato utile?

Soluzione

Il problema è che WCF non va in tutte le assemblee e cerca di trovare tutti possibilmente sottotipi di Shape. Inoltre non trasmette le informazioni sul tipo (montaggio, completo nome del tipo) con il documento XML.

Così, mentre sarebbe non un problema per generare un tag "Circle" sul XML in uscita, il deserializater in entrata sarebbe non sa cosa fare con questo.

Il KnownType "hack" è come un registro dei tipi conosciuti che deve essere attuato da entrambe le parti. E 'esplicita. Con questo Registro di sistema, il deserializzatore sa che "Circle" deserializza a digitare X, senza alcuna possibilità di ambiquity e senza dover analizzare tutti i gruppi disponibili o raggiungibili per i tipi di derivati.

Ricordate, Piazza non dice "io sono una forma", si presenta come un tag XML e da non che si fa facilmente e automaticamente sapere quali .NET classe da utilizzare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top