强制.NET Web服务使用本地对象类,而不是代理类

时间:2008-10-19 19:55:31

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

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

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

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

3 个答案:

答案 0 :(得分:3)

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

此外,只有当您的公共类可序列化并按值传递时(即,它作为数据协定公开,而不是作为服务合同公开),这将起作用。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:0)

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