ASP.NET Web 服务结果、代理类和类型转换

Posted

技术标签:

【中文标题】ASP.NET Web 服务结果、代理类和类型转换【英文标题】:ASP.NET Web Service Results, Proxy Classes and Type Conversion 【发布时间】:2010-09-05 14:54:41 【问题描述】:

我对 ASP.NET 世界还很陌生,所以我可能会在这里偏离基础,但到目前为止,这是我(有限的)知识中最好的!

假设我在 Business 命名空间中有一个标准的业务对象“Contact”。我编写了一个 Web 服务来从数据库中检索联系人的信息并将其返回。然后我编写一个客户端应用程序来请求所述详细信息。

现在,我还创建了一个实用方法,它接受一个“联系人”并用它做一些魔法,比如Utils.BuyContactNewHat() 说。这当然需要Business.Contact 类型的联系人。

然后我回到我的客户端应用程序并想要使用BuyContactNewHat 方法,所以我添加了对我的 Utils 命名空间的引用,它就在那里。然而,问题出现了:

Contact c = MyWebService.GetContact("Rob);
Utils.BuyContactNewHat(c); // << Error Here

由于GetContact 的返回类型是MyWebService.Contact,而不是预期的Business.Contact。我理解这是为什么,因为在访问 Web 服务时,您实际上是在针对 WSDL 生成的代理类进行编程。

那么,有没有一种“更简单”的方法来处理这种类型的不匹配?我正在考虑尝试创建一个通用转换器类,它使用反射来确保两个对象具有相同的结构,而不是简单地将值从一个对象传输到另一个对象。

【问题讨论】:

【参考方案1】:

你在正确的轨道上。要将代理对象中的数据返回到您自己的对象之一,您必须执行左手右手代码。即复制属性值。我敢打赌,已经有一个使用反射的通用方法。

如果他们只想通过网络获取业务对象,他们会使用 Web 服务(.net 远程处理)以外的其他东西。或者他们将使用二进制序列化。我猜你使用网络服务是有原因的,所以你必须复制属性。

【讨论】:

【参考方案2】:

您实际上不必使用 WSDL 为您提供的生成类。如果您看一下它生成的代码,它只是调用一些 .NET 框架类来提交 SOAP 请求。在过去,我已经将该代码复制到一个普通的 .cs 文件中并对其进行了编辑。虽然我没有具体尝试过,但我看不出为什么不能删除代理类定义并使用原始类来接收 SOAP 调用的结果。它一定已经在幕后进行反射了,这样做两次似乎很可惜。

【讨论】:

【参考方案3】:

我建议您编写一个 Schema Importer Extension,您可以使用它来控制代理代码生成。这种方法可用于(优雅地)解决您的问题而不会产生混乱(例如将对象从一个命名空间复制到另一个命名空间,或修改代理生成的 reference.cs 类,以便在下次更新 Web 引用时替换它)。

这是一个关于这个主题的(非常)好的教程:

http://www.microsoft.com/belux/msdn/nl/community/columns/jdruyts/wsproxy.mspx

【讨论】:

以上是关于ASP.NET Web 服务结果、代理类和类型转换的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Web API 2 的返回结果

试图从asp.net web api self host中的请求中获取用户代理

在asp.net中如何将DataSet类型的数据集转换为List类型

ASP.NET 核心上真的需要反向代理吗?

如何在 Web 服务 asp.net 中返回 linq to sql 查询结果?

如何在 ASP.NET 中等待异步 Web 服务调用的结果以获得最佳性能