2010-02-25 20 views
2

可能在WCF服務:方法返回IList時對象可以是Person類?可能在WCF服務中:方法返回IList <object>對象可以是Person類嗎?

例如:在IServiceContract.cs

[ServiceContract] 
public interface IDAS 
{ 
    [OperationContract] 
    void DoWork(); 

    [OperationContract] 
    List<object> GetAnyClass(); 

} 

和類:

public class DAS : IDAS 
{ 
    public void DoWork() 
    { 
    } 

    public List<object> GetAnyClass() 
    { 
     List<Person> a = new List<Person>(); 
     a.Add(new Person()); 
     return a; 
    } 
} 

在運行時的問題是:

System.ServiceModel.CommunicationException:服務器未提供有意義的回覆;這可能是由於合同不匹配,過早會話關閉或內部服務器錯誤引起的

回答

1

理論上是的,儘管您需要告訴服務器它可能期望在您的方法上使用KnownTypeAttribute的Person對象。

[OperationContract] 
[KnownType(typeof(Person))] 
List<object> GetAnyClass(); 

我真的會三思而後在實踐中這樣做雖然 - 對你希望返回對象,而不是聲明不同的方法簽名:

[OperationContract] 
IList<Person> GetPeople(); 

[OperationContract] 
Person GetPerson(); 

[OperationContract] 
IList<Book> GetBooks(); 

[OperationContract] 
Book GetBook(); 

它應該成爲一個合同,即具體的,所以如果你突然改變你返回的類的類型,它可能真的把客戶弄得一團糟。

另外在你的例子中,你正在返回一個具體List類 - 這應該避免,而不是使用IList<>Collection<>

+0

好的。但是當: 返回null; 或 IList a = null; 返回null; 問題不存在。 爲每個類實現一個方法真的需要嗎? 我有50個表和50個類的DTO映射。 那麼,需要我50個方法嗎? 我嘗試製作RIA silverlight應用程序。 對不起,我英語不好。 你的評論對我有幫助很大。 – Cheva 2010-02-25 15:34:47

+1

問題是WCF認爲它獲取的是一個對象,實際上它獲取了一個Person,並且它不知道Person的任何內容。當你返回null時,它知道null,所以沒關係。將KnownType屬性添加到您的方法中,並在Person類中添加[DataContract]。相信我 - 這將有助於將你的方法分離出來,並且讓其他人(和你自己)閱讀你的代碼以更準確地知道你得到的是什麼。 – 2010-02-25 16:00:36

0
  1. 是的,您可能需要更新Visual Studio中的引用(或用於生成代理類的任何內容)並更改返回的集合類型。 「配置服務參考」中有一個選項,您可以在其中選擇Generic.List(右鍵單擊您的WCF服務參考)。
  2. 不匹配是因爲您在服務器端更改了服務而沒有獲得新的代理服務器。所以,改變它返回一個Generic.List,然後使用步驟重新生成1

希望幫助

瑞安

0

您可以返回一個IList但它definitly不採取一個好方法。

當你公開你的服務時,你需要服務另一端的人知道他們得到了什麼。

IList<Person>對於每個使用這些服務或服務中的代碼的人都會更清楚。

如果您需要一種可以返回不同類型的對象的方法,只需在多個操作中將其拆分即可。

IList<Person> GetPersons(...) 
IList<Animal> GetAnimals(...) 

我2美分。

+0

好的,但是,當我知道一組類像人,動物,客戶等,並需要填寫IList ? 這是同樣的任務,一次又一次。 填寫實體列表的一種方法是非常錯誤的嗎? 我同意你的意見。所以一切都更加有條理和清晰。 但是,通過類名或類類型,我可以獲取表名並使用ado.net訪問BD和DataReader,然後我可以使用一種獨特的方法。 這是錯的? 感謝您的意見。 – Cheva 2010-02-25 23:16:35

0

Cheva(等人),

沒有什麼阻止你調用一個方法來填補你從服務調用返回集合(或多個)英寸

IList<Person> GetPersons(...) 
IList<Animal> GetAnimals(...) 

GetPersons()和GetAnimals()都可以調用一個內部方法,例如,

IList<Animal> GetAnimals(...) 
    { 
    // get list of objects of a given type 
    internalIList<Object> genericResults = GetItems( 
     ItemType.Persons|ItemType.Animals); 

    ... 

    IList<Animal> results; 

    // convert to specific type 
    results = new IList<Animal>(genericResults); 

    return results; 
    } 

這應該工作,但我沒有測試它或任何東西。因人而異。 ; )

-Scott

相關問題