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

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

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

有帮助吗?

解决方案

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

此外,只有当您的公共类可序列化并按值传递时(即,它作为数据契约公开,而不是作为服务契约)。

其他提示

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

第一个解决方案非常脆弱,每次服务接口更改时都会导致您修改代理类。第二种技术运作得相当好,我们在之前的项目中使用过。使用这些方法中的任何一种,您都需要确保所有呼叫者继续使用最新版本的界面。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top