WCF サービス - 下位互換性の問題
-
08-06-2019 - |
質問
いくつかの WCF サービスを作成し始めたところですが、レガシー (.NET 1.1 および 2.0) クライアント アプリケーションに対して下位互換性を持たせる必要があります。
3.0 以降のクライアントでサービスを正しく実行することはできましたが、basicHttpBinding エンドポイント (必要な互換性のために必要だと考えられます) を使用してサービスを公開すると、サービスによってメソッド シグネチャがリファクタリングされます。例えば
public bool MethodToReturnTrue(string seedValue);
クライアント アプリには次のように表示されます
public void MethodToReturnTrue(string seedValue, out bool result, out bool MethodToReturnTrueResultSpecified);
セルフホスティング コンソール アプリの app.config で考えられるすべての構成パラメーターを試しましたが、この機能を期待どおりに作成できないようです。これは私の期待が間違っているという事実につながる可能性がありますが、WCF サービスが下位レベルのクライアントに対する bool 戻り値の型を処理できないことに驚くでしょう。
現在の 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>
どなたかアドバイスをいただけませんか?
解決 2
この問題を短期的に解決する必要があったため、「相互運用」、つまり互換性レイヤーのアイデアを思いつきました。
簡単に言えば、私たちが行ったのは、従来の ASMX Web サービスをプロジェクトに追加し、ネイティブ WCF 呼び出しを使用してそこから WCF サービスを呼び出すことだけでした。その後、大幅なリファクタリング作業を行わずに、適切な型をクライアント アプリケーションに返すことができました。これがハッキングな解決策だったことは承知していますが、これほど大規模なレガシー コードベースに対しては最善の選択肢でした。さらに嬉しいことに、それは実際に驚くほどうまく機能するということです。:)
他のヒント
ああ、これは死ぬほどだ!3か月ほど前に仕事でやったのですが、今では詳細をまったく思い出せません。
ただし、basicHttpBinding が必要で、新しいシリアライザー (デフォルト) は使用できないことを覚えています。「古い」XmlSerializer を使用する必要があります。
残念ながら、これを行った場所ではもう働いていないので、コードを見に行くことはできません。上司に電話して、何が調べられるか聞いてみます。
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 名は ASMX アクション名とは異なる構造になっているため、操作アクション名を手動で設定する必要があります (WCF にはインターフェイス名も含まれますが、ASMX には含まれません)。
使用するデータ コントラクトはすべて、次のように装飾する必要があります。 [XmlType]
それよりも [DataContract]
.
構成ファイルを変更する必要はありません。