2008-08-08 23 views
7

私はいくつかのWCFサービスの作成に取り掛かりつつありますが、レガシー(.NET 1.1および2.0)クライアントアプリケーションに対して下位互換性を持たせる必要があります。WCFサービス - 下位互換性の問題

私は、3.0以上のクライアントで正しく動作するサービスを手に入れることができましたが、必要な互換性のために必要と思われるbasicHttpBindingエンドポイントを使用してサービスを公開すると、サービスのリファクタ。例えば

public bool MethodToReturnTrue(string seedValue); 

は私が私のセルフホスティングコンソールアプリのapp.configをで考えることができますが、私は見えることはできませんすべての設定パラメータを試してみた

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

としてクライアントアプリケーションに表示されますこの機能を期待どおりにする。私はこれが私の期待に間違いがあるという事実につながるかもしれないと思うが、私はWCFサービスが下位レベルのクライアントにブールリターン型を扱うことができないことに驚くだろう。

現在のapp.configは次のようになります。

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

誰でもアドバイスできますか?

答えて

3

OK、私たちは短期間でこの問題を解決する必要があったので、 "interop"または互換性のレイヤーを考えました。

Baiscally、従来のASMX Webサービスがプロジェクトに追加され、ネイティブWCF呼び出しを使用してWCFサービスが呼び出されました。その後、再考を行うことなく、適切なタイプをクライアントアプリケーションに戻すことができました。私はそれがハックな解決策であることを知っていますが、それは私たちがそのような大きなレガシーコードベースで持っていた最良の選択でした。さらに、実際には驚くほどうまく機能するという利点があります。 :)

3

ああ、これは私を殺しています!私は約3ヶ月前にこれを仕事でやったが、今はすべての詳細を覚えていない。

ただし、basicHttpBindingが必要で、新しいシリアライザ(既定値)を使用することはできません。 "古い" XmlSerializerを使用する必要があります。

残念ながら、私はもうこれをやったところで働かないので、コードを見ることはできません。私は上司に電話をして、私が掘り起こすことができるものを見ます。

0

XmlSerializerを使用する必要があります。たとえば:

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

あなたは自動生成されたWCF名は(WCFは、同様のインタフェース名が含まれ、ASMXはない)異なったASMXアクション名から構成されているので、手動操作アクション名を設定する必要があります。

使用するすべてのデータコントラクトは、[DataContract]ではなく[XmlType]としてください。

設定ファイルを変更する必要はありません。