2010-09-15 60 views
9

我有一个简单的wcf服务契约,如果我使用接口的具体实现,但是如果我想在参数中使用接口而不是具体的类,它会给出我将在下面显示的错误。为什么我的操作不能在我的wcf客户端中使用接口作为参数?

这里是代码:

[ServiceContract] 
public interface IClientUserRegistration 
{ 
    [OperationContract] 
    void RegisterClientUser(ClientUser clientUser); 

    [OperationContract] 
    List<ClientUser> GetUsers(); 
} 

如果我IClientUser取代ClientUser,WCF测试客户端说,不支持RegisterClientUser 操作,因为它使用System.Object类型。如果我用List替换GetUsers的返回值,它说这个操作不被支持,因为它使用了System.Object []类型。为什么会出现这些错误?

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

回答

13

SOAP没有接口的概念。这往往会导致反序列化困难。

+0

如果它是基于REST的服务,我可以使用接口还是相同。我是新来的,所以原谅我。关于我的问题的另一部分,因为你提到SOAP没有接口的概念。如果我想注册不同的客户端,我是否必须重写RegisterClientUser方法,例如,RegisterClientUser(SuperUser superUser); – Xaisoft 2010-09-15 18:20:03

+3

是的,无论如何都是一样的。想象一下,试图制作一个对象内所有值的XML表示,但你只知道一小部分键。你将无法完成你的任务。 WCF以同样的方式看待它。 – 2010-09-15 18:25:28

+4

Spot on on - WCF调用是** NOT ** .NET函数调用 - 它们是从客户端传递到服务器(并返回)的序列化消息,并且接口不适用于序列化.... – 2010-09-15 18:26:20

11

这是因为必须序列化客体和服务器之间的对象。您不允许传递“对象”类型。所有类型都必须是具体的,以便它们可以正确地序列化和反序列化。一个接口只不过是一个带有接口子类型的“对象”类型。整个对象不能被反序列化并以这种方式进行序列化,只有接口成员才可以。这会使双方的实施变得非常混乱。

+0

谢谢你介意看看我对约翰桑德斯的评论。 – Xaisoft 2010-09-15 18:22:45

相关问题