【问题标题】:.NET webservice using an instance of a parameter type?.NET webservice 使用参数类型的实例?
【发布时间】:2010-09-16 14:51:33
【问题描述】:

我的解决方案中有一个 Windows 窗体项目和一个 Web 服务项目,我正在尝试调用 Web 服务并返回一个客户对象作为结果。问题是当我尝试接收返回对象时,我收到一个无法转换它的错误。例如,这是我的网络服务的签名:

Public Function GetDriverByID(ByVal DriverID As Integer) As Driver

这是我用来调用它的代码:

    Dim d As Driver = mywebserviceinstance.GetDriverByID(1)

但我收到此编译时错误(wsDrivers 是我添加到表单项目中的 Web 引用的名称):“ProjectNamespace.Common.wsDrivers.Driver 类型的值无法转换为 ProjectNamespace.Common.Driver "

这个“Common”命名空间包含 Driver 类,我不确定为什么来自 Web 服务的返回类不仅仅是一个通用的“Driver”,而是一个“wsDrivers.Driver”,我可以不要把它转换回来。有人知道我该如何处理这种类型不匹配吗?

编辑:感谢您的解释 - 这实际上清楚地说明了它在做什么。但是,有什么方法可以强制它使用实际类型而不是代理(或者,有什么方法可以在“真实”实例和“代理”实例之间进行转换),还是我必须在通过网络发送属性之前序列化属性,然后手动反序列化返回值?

【问题讨论】:

    标签: vb.net web-services types proxy-classes


    【解决方案1】:

    VB.NET 或C# 项目中的Web 服务引用可以引用任何 类型的Web 服务,并且不限于ASP.NET 提供的那些。这就是 Visual Studio 为每个可以从 Web 服务检索的对象创建代理类的原因。

    【讨论】:

    • 在我对 Web 服务进行的一些测试中,我使用了一个类,该类将一个类的每个公共属性复制到另一个类,但这会随着更深层次的结构而变得复杂……知道一种使用实际 .NET 类的方法而不是生成的 Web 服务引用对我来说也会很有趣!
    【解决方案2】:

    这实际上很常见。发生的事情是 Web 服务已经在其中定义了 Web 服务中使用的所有类型的定义。当您添加对该 Web 服务的引用时,它会在您的命名空间的子命名空间中自动生成一个代理类型。这就是您调用 Web 服务时返回的内容。

    但是,您可能还引用了 Web 服务单独执行的包含相同类型的同一库。这是您在调暗驱动程序时所期望的类型。这就是不匹配的原因。

    【讨论】:

    • 有什么办法解决这个问题吗?由于我在两个项目(Web 服务和具有 Web 引用的项目)中引用了相同的 DLL,我可以强制“代理类”成为其实际类的副本吗?或者有没有一种简单的方法可以将它们相互映射?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    相关资源
    最近更新 更多