WCF Service - Zpětná problém s kompatibilitou

hlasů
7

Jen jsem se dostal do vytváření některé služby WCF, ale mám požadavek, aby byly zpětně kompatibilní pro starší (.NET 1.1 a 2.0) klientské aplikace.

Podařilo se mi získat služby, aby správně fungoval pro 3.0 a vyšší klientelu, ale když jsem publikovat služby pomocí basicHttpBinding koncový bod (což je podle mého názoru nutné pro kompatibilitu, které potřebuji), služba refactors moje metoda podpisy. např

public bool MethodToReturnTrue(string seedValue);

Zdá se, že klientské aplikace jako

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

Zkoušel jsem všechny konfigurační parametr můžu myslet na App.config pro mou vlastní-hosting konzole aplikace, ale nemůžu dělat tuto funkci podle očekávání. Myslím, že by to mohlo vést k tomu, že moje očekávání jsou chybné, ale byl bych překvapen, že WCF služba není schopna zvládnout typ bool návratu platné pro klienta nižší úrovně.

Můj současný App.config vypadá takto.

<?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>

Může někdo poradit, prosím?

Položena 08/08/2008 v 13:48
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
3

OK, jsme potřebovali k vyřešení tohoto problému v krátkodobém horizontu, a tak jsme přišli s myšlenkou „interop“, nebo vrstva kompatibility.

Baiscally, všechno, co jsme udělali, bylo přidáno tradiční ASMX webové služby do projektu, a nazval WCF službu z toho pomocí nativního WCF volání. Byli jsme pak mohli vrátit příslušné typy zpět do klientské aplikace, aniž by značné množství re-factoringové práce. Já vím, že je to hacky řešení, ale to byla ta nejlepší volba měli jsme s tak velkým starším kódu základny. A bonus je, že to skutečně funguje překvapivě dobře. :)

Odpovězeno 19/08/2008 v 11:45
zdroj uživatelem

hlasů
3

Ach, to mě zabíjí! Udělal jsem to v práci asi 3 měsíci, a teď nemohu vzpomenout na všechny detaily.

Vzpomínám si však, že je třeba basicHttpBinding, a nelze použít nový Serializátor (což je výchozí nastavení); budete muset použít „staré“ XmlSerializer.

Bohužel, nemám práci v místě, kde jsem dělal to ještě, takže nemůžu jít podívat na kód. Zavolám svého šéfa a uvidíme, co se dá vykopat.

Odpovězeno 10/08/2008 v 03:09
zdroj uživatelem

hlasů
0

Ty mají použít XmlSerializer. Například:

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

Budete muset ručně nastavit název operace akce, protože automaticky generovaný název WCF je konstruován odlišně od jména ASMX akce (WCF obsahuje název rozhraní stejně, ASMX nemá).

Veškeré datové smlouvy, které používáte, by měly být zdobené [XmlType], spíše než [DataContract].

Váš konfigurační soubor by nemělo být nutné měnit.

Odpovězeno 28/09/2010 v 08:42
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more