代码之家  ›  专栏  ›  技术社区  ›  Cheva

在WCF服务中是可能的:当对象可以是Person类时,方法return IList<object>?

  •  2
  • Cheva  · 技术社区  · 14 年前

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

    [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 回复  |  直到 14 年前
        1
  •  2
  •   Andy Shellam    14 年前

    理论上是的,尽管您需要告诉服务它可能需要一个Person对象使用 KnownTypeAttribute 你的方法。

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

    不过,在实践中,我确实会三思而后行—而是为您希望返回的对象声明不同的方法签名:

    [OperationContract]
    IList<Person> GetPeople();
    
    [OperationContract]
    Person GetPerson();
    
    [OperationContract]
    IList<Book> GetBooks();
    
    [OperationContract]
    Book GetBook();
    

    等。

    它应该是一个契约,也就是说,具体的,所以如果你突然改变了你返回的类的类型,它真的会把客户弄得一团糟。

    List 类-应该避免这种情况,而是使用 IList<> Collection<>

        2
  •  0
  •   Ryan O'Neill    14 年前
    1. 是的,这是可能的,您需要更新visualstudio中的引用(或者任何用于生成代理类的引用)并更改返回的集合类型。“配置服务引用”中有一个选项,您可以在其中选择Generic.List(右键单击您的WCF服务引用)。
    2. 不匹配是因为您在服务器端更改了服务,但没有获得新的代理。因此,将其更改为返回Generic.List,然后使用1中的步骤重新生成。

    赖安

        3
  •  0
  •   NPayette    14 年前

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

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

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

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

        4
  •  0
  •   Scott K. Fraley    14 年前

    切瓦(等),

    没有什么可以阻止您调用单个方法来填充从服务调用返回的集合。

    IList<Person> GetPersons(...)
    IList<Animal> 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;
      }
    

    这应该管用,但我没有测试。YMMV.)