Pregunta

Tengo una interfaz de servicio:

[ServiceContract]
[ServiceKnownType(typeof(Models.ArticleImage))]
public interface IPhotoManagementService
{
    [OperationContract]
    bool Login(string username, string password);

    [OperationContract]
    bool IsLoggedIn();

    [OperationContract]
    void UpdateImage(string articleID, string selectedImage);
}

Como puede ver, especifico un tipo de (Models.ArticleImage) en mi contrato de servicio.

Por lo tanto, la creación del WSDL de este servicio debería hacer que ArticleImage aparezca en el WSDL.Lamentablemente esto no sucede en absoluto.¿Porqué es eso?

ArticleImage tiene DataContract.Y cuando devuelvo un ArticleImage en mi interfaz, el WSDL recoge ArticleImage.

Editar:¡Ni siquiera aparece en la referencia del servicio en el proyecto consumidor!


Este es el resultado de muchas pruebas:

  • El modelo que intento agregar es un modelo LINQ to SQL.
  • Cuando agrego un modelo normal con ServiceKnownType, funciona.
  • Cuando uso mis entidades LINQ to SQL en mi interfaz, funciona.
  • Cuando agrego mi entidad LINQ a SQL a través de ServiceKnownType, no aparece.
¿Fue útil?

Solución

¿Por qué sería necesario?¿Dónde expone su servicio algo que podría posiblemente frijol ArticleImage?

Re tu comentario;cuando usas [ServiceKnownType], el trype adicional todavía está expuesto en el "mex" (consumido a través de "svcutil"), pero no en el WSDL.¿Estás utilizando un cliente WCF?Debería aparecer (acabo de comprobarlo...lo hizo).Sin embargo, en general, devolver datos vagos de un servicio web no es una buena idea...subtipos, ¡seguro! Dictionary<string,ArticleImage> o incluso Dictionary<string,SomeBaseType> (con [KnownType] etc), ¡bien!Pero object, HashTable, etc., no son una buena idea (en mi opinión).

También podrías simplemente devolver un lista de tu tipo (List<ArticleImage>) que funcionará en todos los escenarios (y será fácil para WSDL, etc.);y dejar que el cliente haga el diccionario al final.


Con respecto a LINQ-to-SQL;Los objetos para "mex" deben estar decorados con [DataContract] / [DataMember].Puede hacer esto en el diseño alternando la propiedad "serialización" para el dbml.Con este conjunto (Modo de serialización = Unidireccional), debería funcionar.Para ser honesto, creo que sería mejor simplemente agregar un método ficticio que haga que el tipo sea explícito en la API.

Otros consejos

Sólo los tipos utilizados como parámetros de entrada / salida de las operaciones de contratos de servicio se publican en el WSDL.

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