J'ai un problème bizarre qui fait ma tête dansLe passage d'une classe dérivée à une méthode de service Web qui prend un type abstrait
je les classes suivantes définies dans un seul projet.
public abstract class AbstractUnitModel {
public void executeRemoteModel(){}
}
//this class also implements a seperate interface, but I dont think that is the issue
public class BlastFurnaceUnitModel : AbstractUnitModel, IUnitModel {}
maintenant, si je tente quelque chose comme ça, il fonctionne comme prévu:
class Class1
{
public void method1() {
BlastFurnaceUnitModel b = new BlastFurnaceUnitModel();
method2(b);
}
public void method2(AbstractUnitModel a) {}
}
maintenant, j'ai un autre projet qui expose une méthode Web. Cette méthode prend un AbstractUnitModel et l'exécute à distance, puis renvoie les résultats au client. Donc, sur le serveur d'avoir ceci:
[WebMethod]
public AbstractUnitModel remotelyExecuteUnitModel(UnitModelWrapperInterface.AbstractUnitModel unitModel)
{
unitModel.executeRemoteModel();
return unitModel;
}
Et sur le client je ceci:
public void remoteExecution() {
var unitModelWebService = new UnitModelRemoteServer.RemoteModelExecutionWebService();
unitModelWebService.remotelyExecuteUnitModelCompleted += new UnitModelRemoteServer.remotelyExecuteUnitModelCompletedEventHandler(remoteExecutionCompleted);
unitModelWebService.remotelyExecuteUnitModelAsync(this.remoteBF);
}
Mais mon projet ne compilera pas, et je reçois ces erreurs: Erreur 109 La meilleure surcharge match de méthode pour 'CalibrationClient.UnitModelRemoteServer.RemoteModelExecutionWebService.remotelyExecuteUnitModelAsync (CalibrationClient.UnitModelRemoteServer.AbstractUnitModel)' a des arguments invalides
Erreur 110 Argument « 1 »: ne peut pas convertir « UnitModelWrapperInterface.BlastFurnaceUnitModel » à « CalibrationClient.UnitModelRemoteServer.AbstractUnitModel »
Je ne peux pas comprendre pourquoi ce qui se passe. J'ai des références dans le projet de serveur à l'espace de noms où AbstractUnitModel est défini. La seule chose qui m'a l'air un peu drôle est qu'il utilise AbstractUnitModel de l'espace de noms 'CalibrationClient' plutôt que UnitModelWrapperInterface. Il semble que lorsque VS génère le proxy pour un webservice sur le client, il crée une implémentation abstraite partielle de AbstractUnitModel. Est-ce la source de mon problème? Si oui, comment pourrais-je y remédier?
edit pour la solution: Comme indiqué, le client doit connaître toutes les classes qui pourraient être envoyées à travers le fil. J'ai fini par résoudre ce problème en supprimant les classes proxy générées et en référençant la bibliothèque commune. Pas idéal mais assez bon dans cette situation.
Re votre commentaire - J'ai manqué le fait que vous essayiez d'utiliser les objets serveur sur le client. Vous devez utiliser des objets proxy sur le client avec les services Web "old style". Avec XmlInclude, vous devriez obtenir une version proxy de BlastFurnaceUnitModel. –