【问题标题】:How do I use a common class between winforms client and web service?如何在 winforms 客户端和 Web 服务之间使用公共类?
【发布时间】:2009-07-24 16:07:23
【问题描述】:

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

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

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

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

提前致谢

瑞恩

【问题讨论】:

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


    【解决方案1】:

    本应如此。

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

    【讨论】:

    • 它对所有对象进行了一些相当讨厌的重新创建,并且代码是意大利面条,您无法看到实例是 Web 服务还是普通的。在我迁移到 WCF 之前,我现在将手动翻译集合等。谢谢
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多