【问题标题】:Force .NET webservice to use local object class, not proxy class强制 .NET webservice 使用本地对象类,而不是代理类
【发布时间】:2010-09-18 00:41:56
【问题描述】:

我有一个从 Windows 窗体应用程序调用的 Web 服务(两个 .NET,都在同一个解决方案中),我希望我的 Web 服务从项目的​​其他地方返回一个自定义对象 - 这是一个常见的他们都共享一个引用的对象,因为它在我的解决方案的第三个项目中。当我调用 web 服务时,它返回一个“Person”对象,但它位于 web 服务的命名空间中,并且它是从 web 服务本身生成的代理类创建的。因此,我无法对其进行操作并将其返回到我的程序,该程序需要一个基于类的共享副本的“Person”对象,而不是来自 web 服务命名空间的代理副本,当我尝试时出现错误将其 CType 为正确的类类型。

如何强制 web 服务使用类的本地副本,而不是代理副本?我的问题在这种情况下有意义吗?如果没有,我会澄清它。

请注意 - 我已经通过 ByRef 传递所有参数,并使用这些返回值来填充我在返回时创建的对象的副本。这不是最好的方法!

【问题讨论】:

标签: .net web-services class proxy-classes


【解决方案1】:

如果您使用 WCF,那么在客户端和消费者之间使用相同的数据协定和服务接口是否相当容易。您可以在生成的代理类中编译并修改它以使用正确的命名空间或使用ChannelFactory 类为您创建动态代理。

第一个解决方案非常脆弱,每次服务接口改变时都会导致你修改代理类。第二种技术效果很好,我们在我之前从事的一个项目中使用过。使用这两种方法中的任何一种,您都需要确保所有调用者继续使用最新版本的界面。

从您描述问题的方式看来,您希望服务和客户端共享同一个实例。由于 WCF 在您向服务发送和从服务发送类型时对它们进行序列化和反序列化,因此您必须做一些更聪明的事情。这是你的意思吗?

【讨论】:

    【解决方案2】:

    如果您使用 svcutil.exe 生成 WCF 客户端代理,您可以在命令行上使用 /reference 来指定包含公共类的程序集。 Svcutil 应该重用该类定义,而不是在服务代理命名空间中生成新的。

    此外,这仅在您的公共类可序列化并按值传递时才有效(即,它公开为数据协定,而不是服务协定)。

    【讨论】:

    • 这与通过项目本身添加引用不同吗?我在“参考”部分列出了我的通用类。我想我会试试这个 - 如果它有效,那就太棒了,并且指向你!
    【解决方案3】:

    我不确定,但是当您编译 .NET Web 服务时,它会创建一个 DLL 文件,您可以尝试将其用于本地。但是当我构建面向服务的应用程序时,我会在我的解决方案中创建不同的层,例如数据访问层、逻辑层、服务层、UI 层、控制器层,例如在控制器层中,我将执行一种用户身份验证方法,即与数据访问层和逻辑层连接,然后我将在服务层上调用该方法,我也可以在 UI 层上调用它,如果我从 UI 层内调用它,当我想使用它时,它会在本地调用从服务层,我将使用该方法创建一个 Web 方法,该方法将返回一个布尔值或用户名等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      • 2012-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多