可以在WCF服务中:当对象可以是Person类?</object>时,方法返回IList <object>

时间:2010-02-25 15:09:23

标签: silverlight wcf service

可以在WCF服务中:当对象可以是Person类时,方法返回IList吗?

Ex:在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:服务器未提供有意义的回复;这可能是由合同不匹配,过早的会话关闭或内部服务器错误引起的

4 个答案:

答案 0 :(得分: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<>

答案 1 :(得分:0)

  1. 是的,您可以更新Visual Studio中的引用(或者您用来生成代理类的任何内容)并更改返回的集合类型。 “配置服务引用”中有一个选项,您可以在其中选择Generic.List(右键单击您的WCF服务引用)。
  2. 不匹配是因为您在服务器端更改了服务而没有获得新的代理。因此,将其更改为返回Generic.List,然后使用1中的步骤重新生成。
  3. 希望有所帮助

    赖安

答案 2 :(得分:0)

你可以返回一个IList,但这绝对不是一个好的方法。

当您公开服务时,您需要服务另一端的人知道他们得到了什么。

IList<Person>对于使用服务或服务中的代码的每个人来说都会更清楚。

如果你需要一个可以返回不同类型对象的方法,只需将它们分成多个操作。

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

我的2美分。

答案 3 :(得分: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