10

いくつかの 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>

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

4

3 に答える 3

3

OK、この問題を短期的に解決する必要があったので、「相互運用」または互換性レイヤーのアイデアを思いつきました。

基本的に、私たちが行ったのは、従来のASMX Webサービスをプロジェクトに追加し、ネイティブWCF呼び出しを使用してそこからWCFサービスを呼び出すことだけでした。その後、大量のリファクタリング作業を行うことなく、適切なタイプをクライアントアプリケーションに戻すことができました。私はそれがハッキーな解決策であったことを知っていますが、それは私たちがそのような大規模なレガシーコードベースで持っていた最良のオプションでした。そして、追加のボーナスは、それが実際に驚くほどうまく機能することです。:)

于 2008-08-19T10:45:19.497 に答える
3

ああ、これは私を殺している !約 3 か月前に職場でこれを行いましたが、今ではすべての詳細を思い出せません。

ただし、basicHttpBinding が必要であり、新しいシリアライザー (デフォルト) を使用できないことを覚えています。「古い」XmlSerializer を使用する必要があります。

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

于 2008-08-10T02:09:00.523 に答える
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名はASMXアクション名とは異なる方法で作成されるため、操作アクション名を手動で設定する必要があります(WCFにはインターフェイス名も含まれますが、ASMXには含まれません)。

使用するデータコントラクトは、[XmlType]ではなくで装飾する必要があり[DataContract]ます。

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

于 2010-09-28T07:42:05.627 に答える