C#:Webservice更改了预期的参数类型(从普通POCO到自动生成的类)

时间:2009-04-10 21:55:46

标签: c# web-services poco auto-generate

我在类库中有以下类:Artist,这是一个POCO

现在我在web服务中有一个方法(它引用了上面提到的库),其签名如下:

[WebMethod]
public int Artist_AddArtist(Artist a) {
 //
}

当我尝试从应用程序中使用此服务时(也引用了上面提到的类库),Artist_AddArtist方法的预期参数不是Artist,而是一个新的Artist中生成的Reference.cs类型,它是自动生成的部分类。

因此,在我的应用程序中,我使用了库中相同的Artist类,现在Web服务方法需要这个新的自动生成类型,我无法将它的实例传递给Web服务。 / p>

如何解决此问题?

2 个答案:

答案 0 :(得分:3)

也许切换到WCF服务是一种选择。据我所知,使用WCF服务,您可以在服务器和客户端重用相同的类型。

This article解释了如何将ASMX Web服务迁移到WCF服务。

答案 1 :(得分:2)

你不能也不应该解决这个问题。

其他一些人会告诉你做一些事情,比如编辑生成的文件,但这不是一个好习惯(因为一旦更新了Web引用,更改就会消失)。

您所看到的是设计。请参阅Basics: How Web Services Work

简而言之,当您使用“添加Web引用”时,Visual Studio会从服务中下载WSDL文件,并使用WSDL中的XML Schema创建一些代理类来表示架构描述的XML。它还为服务本身创建一个代理类,为服务中的每个操作提供方法。

代理数据类可以序列化为服务期望接收的XML,并且可以从服务器发送的XML中反序列化。

考虑它的一种方法是你只有这个问题,因为客户端和服务都是.NET。如果您的客户端是用Java编写的,那么您就不会考虑共享类。


请注意,如有必要,WCF可以执行此操作。它引入了客户端和服务之间的依赖关系(它们都必须使用包含类的程序集的兼容版本),但是当你需要这样做时,选项就在那里。当这些类中的行为必须由客户端和服务使用时,它很有用。