2008-08-08 20 views
7

Sadece bazı WCF hizmetleri oluşturmaya başlıyorum, ancak bunları eski (.NET 1.1 ve 2.0) istemci uygulamaları için geriye dönük olarak uyumlu hale getirme gereksinimim var.WCF Servisi - Geriye dönük uyumluluk sorunu

3.0 ve daha büyük istemciler için doğru şekilde çalışacak hizmetleri almayı başarabildim, ancak bir basicHttpBinding uç noktasını kullanarak hizmetleri yayınladığımda (ihtiyacım olan uyumluluk için gerekli olduğuna inanıyorum), hizmet yöntem imzalarımı destekliyor . Örneğin.

public bool MethodToReturnTrue(string seedValue); 

Ben kendime olan barındırma konsol uygulaması için app.config aklınıza gelebilecek her yapılandırma parametresi denedim

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

olarak istemci uygulamalar gibi görünüyor, ama ben gibi olamaz Bu işlevi beklendiği gibi yapmak için. Bunun benim beklentilerimin kusurlu olmasına yol açabileceğini düşünüyorum, ancak bir WCF servisinin bir bool dönüş tipini bir alt düzey müşteriye idare edemeyeceğine şaşıracaktım.

Geçerli app.config'im buna benzer.

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

Tavsiye edebilir misiniz, lütfen?

cevap

3

Tamam, bu sorunu kısa vadede çözmemiz gerekiyordu ve bu nedenle "birlikte çalışma" veya uyumluluk katmanı fikrini belirledik.

Baiscally, tüm yaptığımız projeye geleneksel bir ASMX web hizmeti ekledi ve WCF servisini yerel WCF çağrılarını kullanarak çağırdı. Daha sonra, uygun tipler, önemli miktarda yeniden faktoring çalışması olmaksızın, müşteri uygulamalarına geri döndürebildik. Bunun hacky bir çözüm olduğunu biliyorum, ancak bu kadar büyük bir eski kod tabanı ile sahip olduğumuz en iyi seçenek buydu. Ve eklenen bonus aslında şaşırtıcı derecede iyi çalışıyor olmasıdır. :)

3

Ah, bu beni öldürüyor! Bunu 3 ay önce yaptım ve şimdi tüm detayları hatırlayamıyorum.

Ancak şunu hatırlıyorum, basicHttpBinding'e ihtiyacınız var ve yeni serializer'ı kullanamazsınız (varsayılan olan); "eski" XmlSerializer kullanmanız gerekir.

Maalesef, artık bunu yaptığım yerde çalışmaz, bu yüzden kodlara bakamıyorum. Patronumu arayacağım ve ne kazabileceğimi göreceğim.

0

XmlSerializer'ı kullanmanız gerekir. Örneğin:

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

otomatik olarak üretilen WCF adı (WCF hem arayüz adı, ASMX etmemesi durumunda) ASMX işlemi adı farklı imal edilir, çünkü el operasyonu işlem adı ayarlamak gerekir.

Kullandığınız tüm veri sözleşmeleri [DataContract] yerine [XmlType] ile dekore edilmelidir.

Yapılandırma dosyanızın değiştirilmesine gerek yoktur.