Serviciul WCF - Problemă de compatibilitate înapoi

Încep doar să creez câteva servicii WCF, dar am o cerință de a le face compatibile cu versiunile anterioare ale aplicațiilor client (.NET 1.1 și 2.0).

Am reușit să obțin serviciile să funcționeze corect pentru clienți 3.0 și mai mulți, dar când publică serviciile utilizând un element final basicttttBinding (ceea ce cred că este necesar pentru compatibilitatea de care am nevoie), refacctorii serviciului semnăturile metodelor mele. de exemplu.

public bool MethodToReturnTrue(string seedValue);

apare pentru aplicațiile client ca

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

Am încercat fiecare parametru de configurare la care mă pot gândi în app.config pentru aplicația mea de consola de auto-găzduire, dar nu par să fac această funcție așa cum era de așteptat. Presupun că acest lucru ar putea duce la faptul că așteptările mele sunt eronate, dar aș fi surprins că un serviciu WCF nu este capabil să trateze un tip de returnare de bool la un client de nivel inferior.

Actualul meu app.config arată astfel.

<?xml version="1.0" encoding="utf-8" ?>
  
  
    
      
        
        
        
      
    
    
      
        
            
        
      
    
  

Poate cineva să vă sfătuiască?

0
fr hi bn

3 răspunsuri

Avem nevoie să rezolvăm această problemă pe termen scurt, așa că am venit cu ideea unui strat de "interop" sau de compatibilitate.

În mod baic, tot ce am făcut a fost adăugat un serviciu web tradițional ASMX la proiect și a apelat la serviciul WCF de la cel care folosea apeluri native WCF. Am reușit apoi să reintroducem tipurile corespunzătoare în aplicațiile client fără o cantitate semnificativă de lucrări de re-factorizare. Știu că a fost o soluție greșită, dar a fost cea mai bună opțiune pe care am avut-o cu o bază codificată atât de vastă. Și bonusul adăugat este că funcționează în mod surprinzător de bine. :)

0
adăugat

Ah, asta ma ucide! Am făcut asta la lucru acum 3 luni și acum nu-mi pot aminti toate detaliile.

Cu toate acestea, îmi amintesc că aveți nevoie de basicHttpBinding și nu puteți utiliza noul serializator (care este implicit); trebuie să utilizați vechiul XmlSerializer.

Din păcate, nu lucrez la locul unde am mai făcut asta, așa că nu pot să mă uit la cod. O să-mi sun șeful și să văd ce pot săpat.

0
adăugat

Trebuie să utilizați XmlSerializer. De exemplu:

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

Trebuie să setați manual numele acțiunii de operare deoarece numele WCF generat automat este construit diferit de numele acțiunii ASMX (WCF include și numele interfeței, ASMX nu).

Orice contracte de date pe care le utilizați ar trebui să fie decorate cu [XmlType] mai degrabă decât [DataContract] .

Fișierul de configurare nu trebuie să se schimbe.

0
adăugat