2009-07-30 52 views
2

按我的其他職位約WCF service return values的對象,我是從另一家公司使用Web服務時,當我加入Visual Studio中,返回值裏面的服務引用該方法是object類型的對象。什麼會導致一個WCF服務來回報型「對象」

Web服務的作者給我的代碼,它實際上返回一個類型的對象。

我缺少的東西,或者代理類應該返回一個類型化的價值?

是否有生成代理類或實際服務的設置?

UPDATE:

我看着WCF服務背後的實際類和實現該服務方法的返回值實際上是返回一個接口,該混凝土式工具。具體類型用[DataContract]屬性(和適當的[DataMember]屬性)標記,但該接口沒有這樣的屬性。這可能導致服務將返回類型設置爲對象?

+0

我更新的任何接受者? – 2009-08-03 00:28:03

+0

你仍然需要顯示一些代碼。在服務合同中顯示操作的簽名。 – 2009-08-03 14:20:25

+0

有沒有你沒有迴應的原因? – 2009-08-09 18:19:58

回答

4

可以想像,如果你是服務開發者,你可以使用一個KnownTypeAttribute

[DataContract] 
[KnownType(typeof(MyConcreteClass))] 
public interface IMyInterface { 
} 

[DataContract] 
public class MyConcreteClass : IMyInterface { 
} 

我沒有親自與接口嘗試這樣做,但我有一個抽象基類嘗試過了,它的工作原理精細。當客戶端收到返回值時,它可以成功向下轉換到派生類。

這可能是該服務代碼實際上這樣做,而問題在於svcutil.exe不產生代理類不夠準確。

雖然您不控制服務代碼,但您確實控制客戶端代理代碼。您可以嘗試手動編輯svcutil.exe給您的代理類,以便自己添加KnownTypeAttribute。通過這樣做,您可以控制DataContractSerializer的行爲,只要您注意不要錯誤地更改數據的連線格式,它應該都可以工作。

1

代理類是生成的文件,因此它可以包含錯誤。如果您有數據合同的副本,您可以自由更改代理類以使用正確的類型而不是System.Object,並且事情應該正常工作。

Visual Studio的「添加服務引用」工具和svcutil.exe是在生成代理類非常好,但他們並不完美。他們生成的文件是你的修改,我鼓勵你簡單地修改操作以返回適當的數據合同。

+0

但是,如果我手動更改自動生成的代理類,然後更新服務,它會覆蓋我的更改嗎? – 2009-07-30 13:56:00

+0

它看起來像代理類是一個部分類。所以我可以通過這種方式進行修改。 – 2009-07-30 13:56:54

+0

您將無法使用部分類更改此設置 - 您需要更改代理本身。如果沒有測試,我不能肯定地說服務更新是否會覆蓋您的更改,但即使如此,解決這個問題也是微不足道的,這將是一個很容易被發現的編譯錯誤。 – 2009-07-30 14:04:29

1

從WCF使用java web服務時,我們遇到了類似的問題。

在我們的情況下,它說這是返回類型爲的竟是返回什麼限量版本。

對我們有用的是將對象轉換爲預期的類型。之後,數據可用。

因此,要解決您的問題,您可以嘗試將對象轉換爲預期的類型。

相關問題