2010-12-05 5 views
0

Je n'ai pas beaucoup travaillé avec les en-têtes de soap, donc j'espère qu'il y a une réponse ici. Voici un exemple simple de ce que j'essaie d'accomplir.ASMX Utiliser le type compilé au lieu du type généré pour SoapHeader

J'ai un service Web ASMX et un client, ainsi qu'une DLL partagée. Dans shared.dll, j'ai un type sérialisable, appelons-le CustomHeader, dérivé de SoapHeader. Il y a une méthode Web qui accepte comme entrée via un attribut SoapHeader, donc mon service ressemble à:

[WebService] 
public class MyService : WebService { 
    public CustomHeader MyCustomHeader { get; set; } 

    [WebMethod] 
    [SoapHeader("MyCustomHeader", Direction = SoapHeaderDirection.In)] 
    public void Go() { } 
} 

Jusqu'à présent, si bon. Dans la méthode Go(), je peux accéder à l'objet MyCustomHeader et faire des choses avec. À partir du client, lorsque je génère un proxy, le code généré inclut une classe CustomHeader contenant les propriétés de données de l'objet MyService et une propriété appelée CustomHeaderValue, que je peux définir sur le client avant de passer l'appel de service à Go() ça passe très bien.

Le problème est que la classe CustomHeader originale avait des constructeurs et des méthodes qui aidaient à remplir les champs de données (fonctions de hachage, valeurs calculées, etc.). Comme le client a une référence à la bibliothèque partagée, le client peut créer une instance de la classe CustomHeader d'origine, mais il ne peut pas utiliser cet objet dans l'appel de service, car il s'agit techniquement d'un type différent.

Je peux penser à quelques façons de gérer tout cela:

1) Convertir l'objet CustomHeader à la classe CustomHeader générée en tirant les propriétés sur un à la fois. Ce ne serait pas beaucoup de traitement, mais cela signifierait que je devrais soit utiliser la réflexion pour faire une boucle sur les propriétés, ou toucher le code de conversion à chaque fois que la classe CustomHeader change.

2) Serialisez l'objet CustomHeader, puis désérialisez-le dans la classe CustomHeader générée - puisqu'ils sont vraiment identiques en dehors des constructeurs et des méthodes, la sérialisation devrait fonctionner correctement. Ce serait le moyen le plus simple, mais il nécessite une série supplémentaire de sérialisation/désérialisation, ce qui, bien que pas très cher, est encore un traitement supplémentaire.

3) Modifier le code généré pour rendre la propriété CustomHeaderValue de mon type partagé au lieu du type généré. Mon opinion est que c'est une façon horrible de faire les choses, mais ce serait probablement la moins chère de ces options. Je ne vais pas faire cette option, mais je voulais juste l'exposer car techniquement cela fonctionnera.

Ai-je raté quelque chose? Existe-t-il un modèle accepté pour ce faire?

Merci pour l'aide.

Répondre

2

Les services Web ASMX ne prennent pas en charge la réutilisation de types entre le client et le service.

WCF ne supporte pas cela.

+0

Merci. J'avais l'impression que je n'allais pas arriver à ce résultat sans passer à la WCF ou faire l'une de mes solutions énumérées ci-dessus. Je vais avec ma solution # 2 ci-dessus, sérialiser et désérialiser l'objet pour le convertir en le type approprié. –

Questions connexes