6

Visual Studio 2008 に約 12 個のメソッドを含む WCF サービス プロジェクトがあり、そのうちのいくつかは bool や string などのプリミティブ型を返します。また、公開された WCF サービスを参照する Visual Studio ユニット テスト プロジェクトもあります。すべての戻り値の型がプリミティブである場合、テスト プロジェクトは正常にコンパイルされます。

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

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

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

WCF サービスのメソッドのコントラクトは次のとおりです。

Page GetItem(string path);

Page クラスには DataContract 属性があり、そのパブリック プロパティには DataMember 属性があります。

サービスが更新されるたびにこれを行う必要があるため、Reference.cs ファイルを変更するのは気が進まない。

なぜこれが起こっているのか知っている人はいますか?

スチュアート。

4

3 に答える 3

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 を参照します。したがって、自動生成されたプロキシでエラーを回避できます。また、手動で作成されたプロキシは、よりシンプルで管理しやすくなります。

于 2010-10-14T10:35:47.347 に答える
1

サービス参照を追加すると、「アセンブリで型を再利用する」オプションが表示されます。これは、重複を整理するための鍵となる可能性があります。

または、重複の原因となっているテスト参照がありますか?

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

于 2009-10-29T10:07:17.767 に答える
0

サービス参照を追加するときは、[詳細設定] をクリックして、[非同期操作の生成] を選択してください。

何が起こっていたのかというと、Web サービスに名前が「Async」で終わる非同期メソッドがいくつかあり、References.cs で生成されたメソッドと競合する可能性があるためだと思います。

たとえば、Web サービスに (1)SayHelloと (2)の 2 つのメソッドが含まれているとしSayHelloAsyncます。

デフォルトのタスクベースの方法を使用して生成すると、以下が生成されます。

  • SayHelloおよびSayHelloAsync(1)の場合
  • SayHelloAsyncそしてSayHelloAsyncAsync(2)。

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

少なくとも、私はそれが起こっていたと思います。とにかく、「非同期操作の生成」を設定するとうまくいきました。

于 2014-09-05T08:39:06.517 に答える