1

我有一个 WCF 服务库项目。我正在尝试通过在 Visual Studio 中运行 WCF 测试客户端(按 F5)来生成 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是其中之一。

要解决并在将来避免此问题,请始终DataContract使用和DataMember显式装饰您用于服务的类型。将这些属性放在任何类上都是非常安全的——如果你从不尝试序列化它,这些属性就会被忽略。

于 2012-06-04T21:13:35.983 回答