Pregunta

Estoy teniendo un poco de problemas para comprender ServiceKnownType en WCF.

este blog, el siguiente código no funciona:

[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());

La razón de que no funciona es porque se está intentando añadir un círculo, pero el ServiceContract sólo permite una forma. Se supone que para hacer algo con knowntypes, pero estoy un poco confundido acerca de cómo funciona.

Dado que el código está en el servicio, ¿por qué no sabe automáticamente que un círculo se deriva de la forma? Además, ¿qué ServiceKnownType realmente?

Cuando ServiceKnownType se pone debajo de la DataContract, al parecer, que hace que funcione. Estoy adivinando que dice Hey, este tipo de objeto particular llamado Forma también puede ser un círculo. Estoy teniendo problemas para entender por qué sería hacerlo de esta manera alrededor, porque si se agrega un nuevo tipo como la plaza que se va a tener que añadir a la clase Shape una ServiceKnownType por ello. ¿No tendría sentido si no se puede inferir que, para poner el KnownType a la plaza en lugar de la Forma? Así dice la Plaza bueno, yo soy una forma, y ??usted no tiene que jugar con la clase Shape? Si su clase Shape está integrado en una biblioteca y desea crear su propia forma dervied como DiamondShape, no se puede agregar a la clase Shape, ya que no tiene acceso al código fuente.

¿Fue útil?

Solución

El problema es que WCF no entra en todos los conjuntos y todos los intentos para encontrar posiblemente subtipos de forma. También no transmite la información de tipo (nombre de tipo de montaje, completo) con el documento XML.

Así que, aunque no sería un problema para generar una etiqueta de "círculo" en el XML de salida, el deserializater entrante no sabría qué hacer con esto.

El KnownType "truco" es como un registro de los tipos conocidos que tiene que ser implementado por ambos lados. Es explícito. Con este registro, el deserializer sabe que "Círculo" deserializa de tipo X, sin ninguna posibilidad de ambiquity y sin tener que analizar todos los conjuntos disponibles o accesibles para los tipos derivados.

Recuerde que la plaza no dice "soy una forma", se trata como una etiqueta XML y desde que usted no sabe con facilidad y de forma automática qué clases de .NET para su uso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top