2012-03-23 152 views
5

我創建了一個WCF服務不支持和默認服務我加在主DataContract另一經營合同:操作在WCF測試客戶端

[OperationContract] 
void DoSomething(UserData data); 

然後,我有這樣的事情(簡化的目的例如)。問題是,即使層次結構中的所有類都使用DataContract裝飾了所有的成員,並且使用DataMember裝飾了它們的所有成員,但當我使用WCF Test Client時,它具有一個紅色圖標,指示「該操作在WCF測試客戶端中不受支持」。

[DataContract] 
public class UserData { 
    [DataMember] 
    public uint One { get; set; } 

    [DataMember] 
    public CompositeType Extra { get; set; } 

    public UserData() { ctor. code } 
} 


[DataContract] 
public class CompositeType { 
    [DataMember] 
    public uint Two { get; set; } 

    public UserData() { ctor code } 
} 
+1

我看到兩個類具有相同的名稱,但一個缺少複合型沒有錯誤,你這是什麼意思?你也忘了發佈複合類型的類。 – Silvermind 2012-03-23 21:45:02

+0

我看到你在談論層次結構。你正在實現任何種類的遞歸關係?因爲這將需要遞歸使用的類用'[DataContract(IsReference = True)]'裝飾' – Silvermind 2012-03-23 23:27:30

+0

@ Silververmind抱歉錯別字錯誤,第二個(已更正)是CompositeType而不是UserData。 我還將IsReference參數添加到主DataContract中使用的子類型,但未解決問題。 – 2012-03-26 01:59:10

回答

4

屬性添加到您的 '的UserData' 類[KnownType(typeof(CompositeType))]

像:

[DataContract] 
[KnownType(typeof(CompositeType))] 
public class UserData 
{ 
    [DataMember] 
    public uint One { get; set; } 

    [DataMember] 
    public CompositeType Extra { get; set; } 

    public UserData() { ctor. code } 
} 

http://msdn.microsoft.com/en-us/library/ms730167.aspx

編輯:

http://msdn.microsoft.com/en-us/library/system.operatingsystem.aspx

的OperatingSystem的類有一個幾個與其他類有關的屬性。您可以將所有這些類都包含在已知類中,但依賴鏈可能會變得相當龐大,我強烈建議不要使用操作系統類。

您應該從操作系統類中找出您實際需要的信息,並創建您自己的DTO以在回覆中傳回。這樣你可以確保所有類型都很容易在你的合同中定義。

+0

我已將KnownType裝飾添加到父類型中,以指示DataMembers的返回值中使用的自定義類的類型,對於層次結構中的那些類,這些自定義類基本上都不是用[KnownType]標記的DataContract。問題依然存在。 – 2012-03-26 04:34:14

+0

@LordofScripts你可以創建一個示例項目並將其上傳到某處,以便我(和其他人)可以看一看。 – Phill 2012-03-26 04:36:12

+0

這是ISampleService.cs – 2012-03-26 05:29:30

0

如果您創建測試客戶端(如控制檯應用程序)並將服務引用添加到wcf,服務是否可以正常工作?如果確實如此,那麼您的數據合同可能具有WCF Test客戶端不支持的其中一種類型。

See this related issue

+0

我在相關問題中看到的URL是.../Name.svc類型,而WCF Test Client向我顯示以下URL: http:// localhost:8731/Design_Time_Addresses/My.WebServices/RegistrationService/mex 如果我在IE上使用它,它什麼也沒有顯示。 – 2012-03-26 02:03:32

0

爲服務調用WCF的默認期望是請求 - 響應 - WCF預期某種迴應的背部。

如果你想使用void(如:沒有返回值),你需要裝飾的方法與

[OperationContract(IsOneWay = true)] 
void DoSomething(UserData data); 

告訴WCF運行時期望從調用

任何返回值

在MSDN雜誌中閱讀更多關於WCF: Working with One-Way Calls, Callbacks and Events

+0

我從來不需要在WCF合同中使用正常綁定的'IsOneWay == true',是不是更適合DualBinding,因爲雙通道可以向客戶端發送獨立響應? – Silvermind 2012-03-23 23:22:57

+0

您不必設置IsOneWay = true,並且您應該知道,如果您這樣做,客戶端將不會收到服務器拋出的任何錯誤異常,因爲它不會等待wcf服務將返回的void響應以允許錯誤異常被傳回。 – 2012-03-24 00:17:08

+0

這也沒有做任何事,同樣的問題。我的操作合同有一個我定義的類型的單個參數,用DataContract標記。該自定義類型具有多個用DataMember標記的屬性,每個屬性都是自定義的(但相當簡單)類型,所有這些子類型在其聲明中標記爲DataContract。 – 2012-03-26 03:27:10

5

OK,通過整個事情已經走了(感謝所有的提示)解決方案是這樣的:

並不需要在所有
  • IsOneWay並不需要
  • 在DataContract屬性在DataContract
    • IsReference屬性甚至在OperationContract返回void時也是如此。
    • 只要層次結構中的所有子類型都是我的,換句話說就是由我定義的,KnownType也是不需要的。NET並用DataContract或DataMember標記
    • 擺脫OperatingSystem並構建包裝DataContract從OperatingSystem中提取必要的信息解決了問題。

    現在有在WCF測試客戶端

    +1

    嗨,堅持一個類似的問題。 「擺脫OperatingSystem並構建一個從OperatingSystem提取必要信息的包裝DataContract解決了這個問題,你到底意味着什麼。」 – Neeraj 2015-04-27 19:50:25

    +0

    卡住了,我們可以得到更新嗎? – Feign 2015-05-14 19:54:04