2010-03-05 5 views
0

Je crée un service Web qui utilise MessageContracts, car je souhaite ajouter des champs personnalisés à mon en-tête SOAP. Dans un previous topic, j'ai appris qu'une réponse composite doit être enveloppée. Pour ce faire, j'ai conçu une classe ResponseWrapper générique.Problème avec MessageContract, types de retour génériques et dénomination client

[MessageContract(WrapperNamespace = "http://mynamespace.com", 
        WrapperName="WrapperOf{0}")] 
public class ResponseWrapper<T> 
{ 
    [MessageBodyMember(Namespace = "http://mynamespace.com")] 
    public T Response 
    { 
     get; 
     set; 
    } 
} 

J'ai fait une classe de base ServiceResult, définie comme suit:

[MessageContract(WrapperNamespace = "http://mynamespace.com")] 
public class ServiceResult 
{ 
    [MessageBodyMember] 
    public bool Status 
    { 
     get; 
     set; 
    } 

    [MessageBodyMember] 
    public string Message 
    { 
     get; 
     set; 
    } 

    [MessageBodyMember] 
    public string Description 
    { 
     get; 
     set; 
    } 
} 

Pour être en mesure d'inclure le contexte de la demande dans la réponse, j'utilise une classe dérivée de ServiceResult, qui utilise des génériques:

[MessageContract(WrapperNamespace = "http://mynamespace.com", 
       WrapperName = "ServiceResultOf{0}")] 
public class ServiceResult<TRequest> : ServiceResult 
{ 
    [MessageBodyMember] 
    public TRequest Request 
    { 
     get; 
     set; 
    } 
} 

Cette option est utilisée de la manière suivante

[OperationContract()] 
ResponseWrapper<ServiceResult<HCCertificateRequest>> OrderHealthCertificate(RequestContext<HCCertificateRequest> context); 

Je me attendais mon code client à générer comme

ServiceResultOfHCCertificateRequest OrderHealthCertificate(RequestContextOfHCCertificateRequest context); 

Au lieu de cela, je reçois le texte suivant:

ServiceResultOfHCCertificateRequestzSOTD_SSj OrderHealthCertificate(CompType1 c1, CompType2 c2, HCCertificateRequest context); 

CompType1 et CompType2 sont propriétés de la classe RequestContext. Le problème est qu'un hash est ajouté à la fin de ServiceResultOfHCCertificateRequestzSOTD_SSj. Comment ai-je besoin de définir mes types de retour génériques pour que le type de client soit généré comme prévu (sans le hachage)?

Répondre

0

Nous avons également eu des problèmes pour renvoyer une liste générique sur WCF.

La solution qui fonctionne pour nous est de créer une classe qui a une seule propriété, et cette propriété est une liste générique. Ensuite, nous envoyons cette classe sur WCF. Si vous avez beaucoup de telles listes, vous pouvez créer une classe qui a une liste de type T. Ainsi, lorsque vous créez la classe, vous pouvez spécifier le type de liste que vous voulez.

+0

J'utilise des types de retour génériques, donc je n'ai pas besoin de définir tout un tas de classes spécifiques. Peut-être que je ne comprends pas ce que vous suggérez, pourriez-vous en dire plus? – Soeteman

Questions connexes