ServiceKnownTypeAttribute non pop-up in WSDL
-
19-09-2019 - |
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.
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.