Domanda

Ho un interfaccia di servizio:

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

Come potete vedere ho specificare un typeof (Models.ArticleImage) sulla mia ServiceContract.

Così costruire il WSDL del servizio dovrebbe causare ArticleImage a pop-up nel WSDL. Unfortunarly questo non accade affatto. Perché?

ArticleImage ha DataContract su di esso. E quando torno un ArticleImage nella mia interfaccia, poi il WSDL fa prendere ArticleImage.

Modifica: non ha nemmeno pop-up in riferimento al servizio del progetto consumando


Questo è il risultato di un sacco di test:

  • Il modello che sto cercando di aggiungere è un modello di LINQ to SQL.
  • Quando aggiungo un modello normale con ServiceKnownType funziona.
  • Quando uso il mio LINQ to SQL entità nella mia interfaccia funziona.
  • Quando aggiungo il mio LINQ to SQL entità attraverso ServiceKnownType non pop-up.
È stato utile?

Soluzione

Perché è necessario? Da dove viene il vostro servizio esporre qualcosa che potrebbe eventualmente essere un ArticleImage?

Re tuo commento; quando si utilizza [ServiceKnownType], il trype supplementare è ancora esposta nelle "mex" (consumate tramite "svcutil") - ma non dal WSDL. Si sta utilizzando un client WCF? Dovrebbe apparire (ho appena controllato ... lo ha fatto). In generale, però, la restituzione di dati vaghi da un web-service, non è una grande idea ... sotto-tipi, sicuro! Dictionary<string,ArticleImage> o anche Dictionary<string,SomeBaseType> (con [KnownType] ecc), bene! Ma object, HashTable, ecc -. Non sono una buona idea (IMO)

Si potrebbe anche solo restituire un del tipo (List<ArticleImage>) che funziona in tutti gli scenari (e facile per WSDL, ecc); e lasciare che il cliente a rendere il dizionario alla loro estremità.


Per quanto riguarda LINQ to SQL; oggetti per "Mex" hanno bisogno di essere decorato con [DataContract] / [DataMember]. È possibile farlo nel disegnato commutando la proprietà "serializzazione" per il dbml. Con questo set (serializzazione Mode = unidirezionale), dovrebbe funzionare. Per essere onesti, però, credo che tu sia meglio-off solo l'aggiunta di un metodo fittizio che rende il tipo esplicito sulle API.

Altri suggerimenti

Solo tipi utilizzati come parametri di input / output delle operazioni di contratti di servizio sono pubblicati nel WSDL.

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