ASP.NET Web 服务结果、代理类和类型转换
-
08-06-2019 - |
题
我对 ASP.NET 世界还是个新手,所以我可能离题很远,但到目前为止,这是我(有限)所知的最好的!
假设我有一个标准业务对象“联系人” 商业 命名空间。我编写了一个 Web 服务来从数据库中检索联系人信息并将其返回。然后,我编写一个客户端应用程序来请求所述详细信息。
现在,我还创建了一个实用方法,它接受“联系人”并用它做一些魔法,比如 Utils.BuyContactNewHat()
说。当然需要 Contact 类型 Business.Contact
.
然后我回到我的客户端应用程序并想要利用 BuyContactNewHat
方法,所以我添加了对我的 实用程序 命名空间,它就在那里。然而,出现了一个问题:
Contact c = MyWebService.GetContact("Rob);
Utils.BuyContactNewHat(c); // << Error Here
由于返回类型为 GetContact
是属于 MyWebService.Contact
并不是 Business.Contact
正如预期的那样。我明白为什么这是因为在访问 Web 服务时,您实际上是针对 WSDL 生成的代理类进行编程。
那么,有没有一种“更简单”的方法来处理这种类型的不匹配呢?我正在考虑尝试创建一个通用转换器类,它使用反射来确保两个对象具有相同的结构,而不是简单地将值从一个对象传输到另一个对象。
解决方案
你走在正确的轨道上。要将数据从代理对象返回到您自己的对象之一,您必须执行左手右手代码。IE。复制属性值。我敢打赌,已经有一个使用反射的通用方法。
如果某些人只想通过网络获取业务对象,他们会使用 Web 服务(.net 远程处理)以外的其他服务。或者他们将使用二进制序列化。我猜您使用网络服务是有原因的,所以您必须进行属性复制。
其他提示
您实际上不必使用 WSDL 为您提供的生成的类。如果您查看它生成的代码,您会发现它只是调用一些 .NET 框架类来提交 SOAP 请求。过去,我将该代码复制到普通的 .cs 文件中并进行编辑。尽管我没有具体尝试过这一点,但我认为没有理由不能删除代理类定义并使用原始类来接收 SOAP 调用的结果。它一定已经在幕后进行反射了,做两次似乎很遗憾。
我建议您考虑编写一个架构导入器扩展,您可以使用它来控制代理代码生成。这种方法可以用来(优雅地)解决您的问题,而不会产生混乱(例如将对象从一个名称空间复制到另一个名称空间,或者修改代理生成的 Reference.cs 类,以便在下次更新 Web 引用时替换它)。
这是关于该主题的(非常)好的教程:
http://www.microsoft.com/belux/msdn/nl/community/columns/jdruyts/wsproxy.mspx