可以在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:服务器未提供有意义的回复;这可能是由合同不匹配,过早的会话关闭或内部服务器错误引起的
答案 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)
希望有所帮助
赖安
答案 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