2009-10-29 34 views
6

Visual Studio 2008には、boolやstringなどのプリミティブ型を返す約12のメソッドを含むWCFサービスプロジェクトがあります。公開されたWCFサービスを参照するVisual Studioユニットテストプロジェクトもあります。すべての戻り値の型がプリミティブである場合、テストプロジェクトは正常にコンパイルされます。カスタムクラスを返すWCFサービスは、Reference.csのエラーを生成します。

カスタムクラスを返すサービスに新しいメソッドを追加し、それを公開し、テストプロジェクトでサービス参照を更新すると、コンパイルされません。エラーは次のとおりです。 -

  1. タイプ 'PublisherFaultException'には 'Reason'の定義が含まれています。
  2. タイプ 'PublisherFaultException'にはすでに 'PropertyChanged'の定義が含まれています。
  3. タイプ 'Publisher.Test.LibraryReference.PublisherFaultException'は、同じパラメータタイプを持つ 'RaisePropertyChanged'というメンバーを既に定義しています。

すべてが自動生成されたreference.csファイルにあります。

Page GetItem(string path); 

とPageクラスはのDataContract属性を持っており、それはパブリックプロパティがデータメンバーの属性を持っています - :

WCFサービスの方法のための契約があります。

私は、このサービスを更新するたびにこれを行う必要があるため、Reference.csファイルを変更するのは嫌です。

これはなぜ起こっているのですか?

スチュアート。

+0

何が起こっているのは、WCFサービス参照の参照が雌犬であることです。あなたの痛みを感じます。 – JohnIdol

+0

svcutilを使用してプロキシを生成しようとしましたか?私は前にこの問題を抱えていたことを覚えています.FaultContract属性を使用してカスタム障害例外を作成していたときでした。私は解決策を覚えていない。だからうまくいけば私のコメントが助けになるかも私は掘り起こし続け、私が解決策を見つけることができるかどうかを見ていきます。 SvcUtil.exeを試して、何が起こっているかを見て、私たちに知らせてください。 – CkH

答えて

1

サービスリファレンスを追加すると、「再利用タイプをアセンブリで」オプションが表示されます。これは、複製をソートするための鍵になりそうです。

または重複を引き起こしているテスト参照がありますか?

また、プロジェクトツリーの[References]セクションを見て、そこに予期しないことがあるかどうかを確認します(同じ名前空間にサービス参照が含まれている2つのアセンブリへの参照がありますか?

+0

"すべての参照アセンブリ内の再利用タイプ"が選択されています。これが事実でしょうか? Pageクラスは、VSソリューションに含まれているが、テストプロジェクトによって直接参照されていないアセンブリに属します。 –

+0

このようにして分担契約の明確なステアリングの議論がありますが、再利用は一般的にうまくいきます。コントラクトアセンブリでPublisherFaultExceptionが発生していますか?適切な契約属性でマークされていますか? (私はあなたが見ている正確なケースを見たことはありませんが、私は根本的に参照の証跡に従うことでそれを引き起こしています)。プロジェクトエクスプローラの上部にある[すべてのファイルを表示]ボタンをクリックし、references.csを調べて生成されたコードを確認し、衝突する可能性があるかどうかを判断します。 –

+0

PublisherFaultExceptionは、サービス参照を更新するときに、自動生成されたReference.csファイル内にあります。これにはPublisherFaultExceptionの2つのクラス宣言が含まれます(両方とも部分クラスです)が、Public Reasonプロパティ、PropertyChangedイベント、およびRaisePropertyChangedメソッドの両方を持ちます。実際のReportPublisherExceptionクラス自体はWCFプロジェクト内にあり、DataContactおよびDataMember属性を持っています。 –

1

自動生成プロキシクラスを使用すると、常に痛みがあります。

このような状況を処理するために、私はデータコントラクトクラスとサービスインターフェイスを持つ別のアセンブリを使用しました。

契約のDLLがあります:


public interface IService 
{ 
    [OperationContract] 
    List GetContentList(); 
} 

[DataContract] 
public class ContentItem 
{ 
    [DataMember] public string Name; 
    [DataMember] public object Data; 
} 

クライアントがContract.dllへの参照を持つことになります。 プロキシを手動で作成されます。


class ServiceProxy : ClientBase<IService>, IService 
{ 
    public List GetContentList() 
    { 
    return Channel.GetContentList(); 
    } 
} 

サーバーDLLは、同じ契約のDLLへの参照を持つことになります。 自動生成されたプロキシでエラーが発生するのを避けることができます。 また、手作業で作成されたプロキシは、よりシンプルで管理しやすくなります。

0

サービスリファレンスを追加する場合は、[詳細設定]をクリックし、[非同期操作の生成]を選択してください。

Webサービスに非同期メソッドがいくつか存在し、References.csで生成されたメソッドと競合する「Async」で終わる名前があると思います。

Webサービスに2つのメソッド(1)SayHelloと(2)SayHelloAsyncが含まれているとします。デフォルトのタスクベースの方法を用いて生成

が生成:

  • SayHelloと(1)
  • SayHelloAsyncSayHelloAsyncAsyncためSayHelloAsyncを(2)。

SayHelloAsyncという2つの生成されたメソッドがあるため、競合が発生しました。

少なくとも、私はそれが起こっていたと思います。とにかく "非同期オペレーションを生成する"設定は私のために働いた。

関連する問題