1

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

这是因为尽管 Web 服务将返回一个 Common.Widget 类型的对象,但它会将该对象包装起来以便通过网络传输它。完成此操作后,我无法将对象转换回“通用”类型,因为 .Net 会引发 InvalidCastException。

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

那么有没有办法让我轻松地做到这一点,或者我必须将从 Web 服务获得的所有数据转换回公共库中的原始类型?

提前致谢

瑞安

4

3 回答 3

2

这是它应该的方式。

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

于 2009-07-24T16:42:40.787 回答
0

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

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

于 2009-07-24T16:30:23.947 回答
0

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

于 2009-07-24T16:34:45.373 回答