2012-06-04 55 views
1

我有一個WCF服務庫項目。我試圖通過在Visual Studio中運行它(通過推送F5)啓動WCF Test Client來生成wsdl文件。它啓動了WCF測試客戶端,但它說「無法添加服務,服務元數據可能無法訪問,請確保您的服務正在運行並展示元數據。」它也給我下面的錯誤信息。如何爲WCF服務庫創建wsdl文件?

c:\ Users \ xxx \ AppData \ Local \ Temp \ Test Client Projects \ 10.0 \ 354421b1-b65e-45fc-8d98-ac87254a5903 \ Client.cs(911,26):error CS0644:'System.ComponentModel。 PropertyChangedEventHandler'不能從特殊類派生'System.MulticastDelegate'

我添加了servive行爲來公開元數據,如下所示。我不知道我在這裏丟失了什麼,能夠生成一個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> 

回答

2

您的元數據綁定沒有問題,但是您的服務中存在編譯器錯誤。這阻止WCF構建您的服務類,這需要公開元數據端點。

修復這個錯誤首先:

「System.ComponentModel.PropertyChangedEventHandler」不能從特殊類「System.MulticastDelegate」

錯誤推導(注意,這是在一個臨時文件)當WCF嘗試將服務合約本地編譯爲可用於訪問服務的類時就會發生。這意味着你正在運行一些在C#中合法的東西,但在WCF中不合法。考慮到錯誤,最有可能的是,您有一個實施INotifyPropertyChanged的班級在您的運營合同中用作數據聯繫人。

請注意,每個類別通過WCF通道序列化是一個數據合同。通常你會用DataContractDataMember屬性來修飾你的課程,這些屬性指示序列化程序如何處理你的課程。但是,如果你不這樣做,你有你的類作爲在OperationContract參數或返回值,WCF只是假裝就像你把這些屬性上公共領域中的類。

在這種情況下,我的猜測是,你有一個類,要傳遞或縮小服務調用,具有:

public event PropertyChangedEventHandler PropertyChanged; 

這是一個公共領域,因此,除非你告訴WCF否則它會嘗試將其序列化爲隱式數據合同的一部分。但是某些類型不能用這種方式進行序列化,而MulticastDelegate就是其中之一。

要解決,並在未來避免這個問題,總是裝點你DataContractDataMember明確對服務的使用類型。將這些屬性放在任何類上是完全安全的 - 如果您從未嘗試對其進行序列化,則會忽略這些屬性。

+0

我注意到我的服務沒有定義任何數據合約/數據成員。我在該服務中只有一份運營合同。任何我應該看看的想法?另一方面,該服務成功建立並託管。但問題是它無法啓動WCF測試客戶端。謝謝! – Jyina

+0

是的,讓我擴大我的答案。 –

+0

非常感謝。它現在非常有意義。我看到作爲參數傳遞給操作契約的類正在實現System.ComponentModel.INotifyPropertyChanged。 – Jyina

相關問題