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

为什么我的wcf客户端中的操作契约不能将接口作为参数?

  •  9
  • Xaisoft  · 技术社区  · 14 年前

    我有一个简单的wcf服务契约,如果我对接口使用具体的实现,它可以正常工作,但是如果我想使用paramaters中的接口而不是具体的类,它会给我错误,我将在下面显示。

    [ServiceContract]
    public interface IClientUserRegistration
    {
        [OperationContract]
        void RegisterClientUser(ClientUser clientUser);
    
        [OperationContract]
        List<ClientUser> GetUsers();
    }
    

    如果我用IClientUser替换ClientUser,WCF测试客户机会说RegisterClientUser 不支持操作,因为它使用类型系统对象. 如果将GetUsers的返回值替换为List,则表示不支持此操作,因为它使用类型系统对象[]. 为什么会出现这些错误?

    我尝试使用IClientUser的原因是,我可以实现实现IClientUser接口的不同用户类型,并将它们传递到RegisterClient,但是如果我只能传递ClientUser,那么我必须创建一组接受不同类型用户的RegisterClient覆盖。

    2 回复  |  直到 13 年前
        1
  •  13
  •   John Saunders    14 年前

    SOAP没有接口的概念。这会使反序列化变得困难。

        2
  •  12
  •   Nathan Wheeler    14 年前

    这是因为在客户端和服务器之间传递对象时必须序列化。不允许传递“对象”类型。所有类型都必须是具体的,这样才能正确地序列化和反序列化它们。接口只不过是一个带有接口子类型的“对象”类型。对象作为一个整体不能被反序列化和序列化,只有接口成员可以被反序列化。这将导致双方的实现都非常混乱。

    推荐文章