如何在winforms客户端和Web服务之间使用公共类?

时间:2009-07-24 16:07:23

标签: .net web-services casting asmx proxy-classes

我继承了一个大型的管理winforms应用程序,该应用程序共享一个“公共”类库,用于通过Web服务保存数据。我遇到的问题是,如果我从Web服务调用返回一个类的填充实例,那么它在客户端上以不同的类型出现,我不能使用其他“公共”项目逻辑来操作。

这是因为虽然Web服务将返回Common.Widget类型的对象,但它会将该对象包装起来以便通过线路传输它。完成此操作后,我无法将对象强制转换回'common'类型,因为.Net会抛出InvalidCastException。

我已经使用WCF和DataMember属性完成了这项工作,但我现在无法将此项目升级到WCF,因为它非常大且测试服务器是Win2K(Win2K没有.Net 3+)。

那么有没有办法让我轻松完成这项工作,或者我是否必须将从Web服务获得的所有数据转换回公共库中的原始类型?

提前致谢

赖安

3 个答案:

答案 0 :(得分:2)

这是应该的方式。

如果代码现在正在运行,那么当您返回其中一种类型时,它目前会做什么?它必须翻译它,这就是ASMX Web服务的行为方式。

答案 1 :(得分:0)

我希望有一种比这更好的方法,但是:如果只将公共库包含在您的Web服务中,然后定义一个Web服务,它返回您想要在两个环境中使用的类型的对象(例如您的Widget)然后,您可以在winforms客户端中使用Widget类型的对象。我认为您所看到的强制转换异常是因为您在两个项目中都包含了Common库 - 即使它们的名称相同,您的winforms应用程序也会将其自身项目中的Common视为与Web服务中的Common不同

我上面提到的方法(包括仅在Web服务中的Common)将允许您在winforms应用程序中使用Common对象,即使它们不是来自Web服务(即您可以使用“new”在本地创建它们)关键字)。

答案 2 :(得分:0)

问题在于,当您的对象通过网络时,它们被反序列化为Web服务代理专用的类。因此,即使类的名称相同,它也是一个单独的类。您会注意到(如果您在Visual Studio中使用F12),Web服务中的类没有“common”项目中的所有类的方法。