我有一个 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
就是其中之一。
要解决并在将来避免此问题,始终使用 DataContract
和 DataMember
显式装饰您用于服务的类型。将这些属性放在任何类上都是完全安全的——如果您从不尝试序列化它,这些属性就会被忽略。
关于wcf - 如何为WCF服务库创建wsdl文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10888372/