6

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

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

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

4

3 回答 3

3

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

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

于 2008-10-19T20:26:49.953 回答
2

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

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

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

于 2008-10-19T20:32:31.017 回答
0

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

于 2008-10-19T20:03:31.903 回答