Question
Existe-t-il un moyen lors de la création de services Web de spécifier les types à utiliser? Plus précisément, je souhaite pouvoir utiliser le même type à la fois sur le client et sur le serveur afin de réduire la duplication de code.
Exemple simplifié:
public class Name
{
public string FirstName {get; set;}
public string Surname { get; set; }
public override string ToString()
{
return string.Concat(FirstName, " ", Surname);
}
}
Je ne veux pas avoir de recodage de fonctionnalités dans ma classe. L’autre chose est que tout code existant manipulant cette classe ne fonctionnera pas côté client car la classe côté client générée serait d’un type différent.
La solution
D'accord, je vois que c'est une décision de conception explicite de la part de SOAP, donc vous n'êtes pas censé le faire J'ai trouvé la page suivante qui explique pourquoi:
Schéma et contrat de partage de services, pas classe . Les services interagissent uniquement sur leur expression de structures à travers schémas et comportements à travers contrats. Le contrat de service décrit la structure des messages et des contraintes de commande sur messages. La formalité de la expression permet la vérification de la machine des messages entrants. Machine vérification des messages entrants vous permet de protéger le service intégrité. Les contrats et les schémas doivent rester stable dans le temps, construisant ainsi leur flexibilité est important.
Cela dit, il existe deux autres possibilités:
- Générez les références Web dans Visual Studio ou à l'aide de wsdl.exe. Ensuite, allez dans le fichier Reference.cs (ou .vb) généré et supprimez le type explicitement. Puis redirigez vers le type souhaité situé dans un autre assemblage.
- Vous pouvez partager des types entre des services Web côté client avec wsdl.exe et le paramètre / sharetypes.
Autres conseils
Si vous souhaitez partager un type ou une structure entre votre service Web et votre client, ajoutez une structure publique à votre projet de service Web, comme suit:
public struct Whatever
{
public string A;
public int B;
}
ajoutez ensuite une méthode à votre service Web dont le type de retour est cette structure:
[WebMethod]
public Whatever GiveMeWhatever()
{
Whatever what = new Whatever();
what.A = "A";
what.B = 42;
return what;
}
Après avoir mis à jour la référence Web de votre client, vous serez en mesure de créer des structures de type Quoi que ce soit dans votre application client, de la manière suivante:
Webreference.Whatever what = new Webreference.Whatever();
what.A = "that works?";
what.B = -1; // FILENOTFOUND
Cette technique vous permet de conserver la définition de toutes les structures que vous devez faire passer en un endroit (projet de service Web).