Question

Je commence tout juste à créer certains services WCF, mais je dois les rendre rétrocompatibles avec les applications clientes héritées (.NET 1.1 et 2.0).

J'ai réussi à faire fonctionner correctement les services pour les clients 3.0 et versions ultérieures, mais lorsque je publie les services à l'aide d'un point de terminaison basicHttpBinding (qui, je crois, est requis pour la compatibilité dont j'ai besoin), le service refactorise mes signatures de méthode.par exemple.

public bool MethodToReturnTrue(string seedValue);

apparaît aux applications clientes comme

public void MethodToReturnTrue(string seedValue, out bool result, out bool MethodToReturnTrueResultSpecified);

J'ai essayé tous les paramètres de configuration auxquels je peux penser dans le fichier app.config pour mon application de console auto-hébergée, mais je n'arrive pas à faire fonctionner cette fonction comme prévu.Je suppose que cela pourrait conduire au fait que mes attentes sont erronées, mais je serais surpris qu'un service WCF soit incapable de gérer un type de retour booléen vers un client de bas niveau.

Mon app.config actuel ressemble à ceci.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>  
  <system.serviceModel>
    <services>
      <service behaviorConfiguration="MyServiceTypeBehaviors" Name="MyCompany.Services.CentreService.CentreService">
        <clear />
        <endpoint address="http://localhost:8080/CSMEX"    binding="basicHttpBinding" bindingConfiguration="" contract="IMetadataExchange" />
        <endpoint address="http://localhost:8080/CentreService" binding="basicHttpBinding" bindingName="Compatible" name="basicEndpoint" contract="MyCompany.Services.CentreService.ICentreService" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyServiceTypeBehaviors" >
            <serviceMetadata httpGetEnabled="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

Quelqu'un peut-il me conseiller, s'il vous plaît ?

Était-ce utile?

La solution 2

OK, nous devions résoudre ce problème à court terme, et nous avons donc eu l'idée d'une « interopérabilité », ou couche de compatibilité.

En gros, tout ce que nous avons fait a été d'ajouter un service Web ASMX traditionnel au projet et d'appeler le service WCF à partir de celui-ci à l'aide d'appels WCF natifs.Nous avons ensuite pu renvoyer les types appropriés aux applications clientes sans un travail de refactorisation important.Je sais que c'était une solution piratée, mais c'était la meilleure option que nous avions avec une base de code héritée aussi importante.Et le bonus supplémentaire est que cela fonctionne étonnamment bien.:)

Autres conseils

Ah, ça me tue !J'ai fait ça au travail il y a environ 3 mois et maintenant je ne me souviens plus de tous les détails.

Je me souviens cependant que vous avez besoin de basicHttpBinding et que vous ne pouvez pas utiliser le nouveau sérialiseur (qui est la valeur par défaut) ;vous devez utiliser le "ancien" XmlSerializer.

Malheureusement, je ne travaille plus à l'endroit où j'ai fait ça, donc je ne peux pas aller voir le code.Je vais appeler mon patron et voir ce que je peux trouver.

Vous devez utiliser XmlSerializer.Par exemple:

[ServiceContract(Namespace="CentreServiceNamespace")]
[XmlSerializerFormat(Style=OperationFormatStyle.Document, SupportFaults=true, Use=OperationFormatUse.Literal)]
public interface ICentreService {
    [OperationContract(Action="CentreServiceNamespace/MethodToReturnTrue")]
    bool MethodToReturnTrue(string seedValue);
}

Vous devez définir manuellement le nom de l'action d'opération, car le nom WCF généré automatiquement est construit différemment du nom de l'action ASMX (WCF inclut également le nom de l'interface, mais pas ASMX).

Tous les contrats de données que vous utilisez doivent être décorés avec [XmlType] plutôt que [DataContract].

Votre fichier de configuration ne devrait pas avoir besoin d'être modifié.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top