【问题标题】:C#: Webservice changes expected parameter type (from a normal POCO to a an autogenerated class)C#:Webservice 更改预期的参数类型(从普通 POCO 到自动生成的类)
【发布时间】:2010-10-18 20:21:17
【问题描述】:

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

现在我在网络服务中有一个方法(它引用了上述库),其签名如下:

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

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

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

我该如何解决这个问题?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您不能也不应该解决问题。

      其他人会告诉您编辑生成的文件之类的操作,但这不是一个好习惯(因为一旦 Web 参考更新,更改就会消失)。

      您所看到的是设计使然。见Basics: How Web Services Work

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

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

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


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

      【讨论】:

      • 那么,将“原始”类的实例更改为“自动生成”类的实例的最佳方法是什么?反映原始的属性值并将每个属性值添加到预期的类型实例中?
      • 你不需要。发送自动生成的类型。
      • 但这意味着将应用程序与特定的 Web 服务耦合,不是吗?因此,取消了对共享库的使用。
      • 我是说不要在客户端使用共享库。客户端将使用并发送自动生成的代理类 - Reference.cs 中的内容。
      猜你喜欢
      • 2014-01-04
      • 2016-07-09
      • 2015-12-30
      • 2011-09-24
      • 1970-01-01
      • 2014-09-05
      • 2021-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多