wcf - 如何为WCF服务库创建wsdl文件?

标签 wcf wcf-binding

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

最佳答案

您的元数据绑定(bind)没有任何问题,但您的服务中存在编译器错误。这会阻止 WCF 构建您的服务类,而公开元数据端点需要这样做。

首先修复此错误:

'System.ComponentModel.PropertyChangedEventHandler' cannot derive from special class 'System.MulticastDelegate'

当 WCF 尝试将服务协定本地编译为可用于访问服务的类时,会发生错误(请注意,它位于临时文件中)。这意味着您遇到了在 C# 中合法但在 WCF 中不合法的情况。最有可能的是,考虑到错误,您有一个实现 INotifyPropertyChanged 的类被用作操作合约中的数据联系人。

请注意,通过 WCF channel 序列化的每个类都是一个数据协定。通常,您会使用 DataContract 来装饰您的类,并使用 DataMember 属性来装饰每个字段,这些属性指示序列化程序如何处理您的类。但如果您不这样做,并且您将您的类作为参数或返回值包含在 OperationContract 中,WCF 就会假装就像您将这些属性放在 每个 类(class)中的公共(public)字段。

在这种情况下,我猜测您有一个类,您正在传入或传出服务调用,该类具有:

 public event PropertyChangedEventHandler PropertyChanged;

这是一个公共(public)字段,因此除非您另外告诉 WCF,否则它将尝试将其序列化为隐式数据协定的一部分。但有些类型无法以这种方式序列化,MulticastDelegate 就是其中之一。

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

关于wcf - 如何为WCF服务库创建wsdl文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10888372/

相关文章:

c# - 使用 NetTCPBinding 进行回调

c# - 从 wcf 绑定(bind) transferMode 从 "Buffered"更改为 "Streamed"是否被视为客户端的重大更改?

c# - 构建Azure云服务失败

WCF 服务已超出最大数组长度配额 (16384)

c# - WCF - 所有服务方法的参数相同

WCF 异常处理 #2

c# - .NET WCF RIA + 服务;我可以全部拥有吗?

wcf - 部署使用 netTcpBinding 的 WCF 服务(非 IIS 托管)

.net - 对 WCF 服务的异步调用以静默方式随机失败

wcf - 如何让 Azure 计算模拟器在 32 位模式下运行?