1

WCF サービス ライブラリ プロジェクトがあります。Visual Studio (F5 を押す) で実行して WCF テスト クライアントを起動し、wsdl ファイルを生成しようとしています。WCF テスト クライアントを起動しましたが、「サービスの追加に失敗しました。サービス メタデータにアクセスできない可能性があります。サービスが実行され、メタデータが公開されていることを確認してください。」と表示されます。また、以下のエラーメッセージが表示されます。

c:\Users\xxx\AppData\Local\Temp\Test Client Projects\10.0\354421b1-b65e-45fc-8d98-ac87254a5903\Client.cs(911,26): エラー CS0644: 'System.ComponentModel.PropertyChangedEventHandler' を派生できません特別なクラス「System.MulticastDelegate」から

次のように、メタデータを公開するためのサービス動作を追加しました。wsdlファイルを生成できるようにするために、ここで他に何が欠けているのかわかりません。助けてくれてありがとう!

<services>
  <service name="CU.Customer" behaviorConfiguration="Metadata">
    <endpoint address="" binding="wsHttpBinding" contract="CU.ICustomer">
      <identity>
        <dns value="localhost"/>
      </identity>
    </endpoint>
    <endpoint name="mex" address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8732/Design_Time_Addresses/CustomerService/Service1/"/>
      </baseAddresses>
    </host>
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="Metadata">
      <!-- To avoid disclosing metadata information, 
      set the value below to false and remove the metadata endpoint above before deployment -->
      <serviceMetadata httpGetEnabled="True"/>
      <!-- To receive exception details in faults for debugging purposes, 
      set the value below to true.  Set to false before deployment 
      to avoid disclosing exception information -->
      <serviceDebug includeExceptionDetailInFaults="False"/>
    </behavior>
  </serviceBehaviors>
</behaviors>
4

1 に答える 1

2

メタデータ バインディングに問題はありませんが、サービスにコンパイラ エラーがあります。これにより、メタデータ エンドポイントを公開するために必要なサービス クラスを WCF が構築できなくなります。

最初にこのエラーを修正してください:

「System.ComponentModel.PropertyChangedEventHandler」は特別なクラス「System.MulticastDelegate」から派生できません

エラー (一時ファイルにあることに注意してください) は、WCF がサービス コントラクトをサービスへのアクセスに使用できるクラスにローカルでコンパイルしようとしているときに発生しています。これは、C# では合法であるが、WCF では合法ではない何かに遭遇していることを意味します。ほとんどの場合、エラーが発生した場合INotifyPropertyChanged、操作コントラクトでデータ コンタクトとして使用されるクラスを実装しています。

WCF チャネルを介してシリアル化されるすべてのクラスはデータ コントラクトであることに注意してください。通常、クラスDataContractと各フィールドをDataMember属性で装飾し、シリアライザーにクラスの処理方法を指示します。しかし、そうしないと、クラスをパラメーターまたは戻り値として に含めるとOperationContract、WCFは、クラスのすべてのパブリック フィールドにそれらの属性を配置したかのように見せかけます。

この場合、私の推測では、サービス呼び出しに出入りするクラスがあり、次のものがあります。

 public event PropertyChangedEventHandler PropertyChanged;

これはパブリック フィールドであるため、WCF に特に指示しない限り、暗黙的なデータ コントラクトの一部としてシリアル化を試みます。ただし、この方法でシリアル化できない特定の型がありMulticastDelegate、それらの 1 つです。

この問題を修正し、将来的に回避するには、サービスに使用する型を常に明示的に装飾します。これらの属性を任意のクラスに配置することは完全に安全です。シリアル化しようとしない場合、属性は単純に無視されます。DataContractDataMember

于 2012-06-04T21:13:35.983 に答える