Question

J'ai un service d'interface:

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

Comme vous pouvez le voir, je précise un typeof (Models.ArticleImage) sur mon ServiceContract.

Ainsi, le bâtiment WSDL de ce service devrait provoquer ArticleImage pour faire apparaître dans le WSDL. Unfortunarly cela ne se produit pas du tout. Pourquoi?

ArticleImage a DataContract dessus. Et lorsque je retourne un ArticleImage dans mon interface, le WSDL ne ramasser ArticleImage.

Modifier: il ne pop même pas dans la référence de service dans le projet consommant


Ceci est le résultat d'un grand nombre de tests:

  • Le modèle que je suis en train d'ajouter un modèle LINQ à SQL.
  • Lorsque j'ajoute un modèle normal avec ServiceKnownType cela fonctionne.
  • Quand j'utilise mon LINQ à des entités SQL dans mon interface cela fonctionne.
  • Quand j'ajouter mon LINQ à l'entité SQL par ServiceKnownType il ne se déclenche pas.
Était-ce utile?

La solution

Pourquoi aurait-il besoin? Où votre service expose quelque chose qui pourrait peut un ArticleImage?

Re votre commentaire; lors de l'utilisation [ServiceKnownType], le trype supplémentaire est toujours exposée dans les « » (MEX consommés par « svcutil ») - mais pas par le WSDL. Utilisez-vous un client WCF? Il devrait apparaître (je viens de vérifier ... il l'a fait). En général, cependant, le retour des données vagues d'un service web est pas une bonne idée ... sous-types, bien sûr! Dictionary<string,ArticleImage> ou même Dictionary<string,SomeBaseType> (avec [KnownType] etc), très bien! Mais object, HashTable, etc -. Ne sont pas une bonne idée (OMI)

Vous pouvez aussi vous retourner un Liste de votre type (List<ArticleImage>) qui fonctionne dans tous les scénarios (et être facile pour WSDL, etc.); et laisser le client faire le dictionnaire à leur fin.


En ce qui concerne LINQ to SQL; objets pour besoin « MEx » à décorer avec [DataContract] / [DataMember]. Vous pouvez le faire dans le conçu par basculer la propriété « sérialisation » pour le dbml. Avec cet ensemble (sérialisation Mode = Unidirectionnel), il devrait fonctionner. Pour être honnête, cependant, je pense que vous être mieux lotis que l'ajout d'une méthode factice qui fait le type explicite sur l'API.

Autres conseils

Seuls les types utilisés comme paramètres d'entrée / sortie des opérations de contrats de services sont publiés dans le WSDL.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top