ASP.NET Web服务结果,代理类和类型转换
我仍然对ASP.NET还是陌生的,所以我在这里可能会很陌生,但是到目前为止,这是我所知(有限的)!
可以说我在Business名称空间中有一个标准的业务对象" Contact"。我编写了一个Web服务来从数据库中检索联系人的信息,然后将其返回。然后,我编写一个客户端应用程序以请求上述详细信息。
现在,我还创建了一个实用方法,该方法接受一个" Contact"并对其进行一些魔术处理,例如" Utils.BuyContactNewHat()"。当然,哪一个采用类型为Business.Contact的Contact。
然后,我返回到客户端应用程序,并想利用" BuyContactNewHat"方法,因此我添加了对Utils名称空间的引用。但是,出现以下问题:
Contact c = MyWebService.GetContact("Rob); Utils.BuyContactNewHat(c); // << Error Here
由于GetContact的返回类型是MyWebService.Contact,而不是Business.Contact。我理解为什么会这样,因为访问Web服务时,实际上是针对WSDL生成的代理类进行编程。
那么,有没有一种"简便"的方法来处理这种类型的不匹配?我正在考虑尝试创建一个通用的转换器类,该类使用反射来确保两个对象具有相同的结构,而不是简单地将值从一个对象传递到另一个对象。
解决方案
回答
我们走在正确的轨道上。为了使数据从代理对象返回到我们自己的对象之一,我们必须执行左右手代码。即复制属性值。我打赌,我们已经有了使用反射的通用方法。
如果某些人只是想通过网络获取业务对象,则将使用Web服务(.net远程处理)以外的其他功能。否则他们将使用二进制序列化。我猜我们使用Web服务是有原因的,因此我们必须进行属性复制。
回答
实际上,我们不必使用WSDL为我们提供的生成的类。如果我们看一下它生成的代码,它只是对某些.NET框架类进行调用以提交SOAP请求。过去,我已将该代码复制到普通的.cs文件中并对其进行了编辑。尽管我没有专门尝试过,但是我看不出为什么我们不能删除代理类定义并使用原始类来接收SOAP调用的结果。它必须已经在引擎盖下进行反射了,两次做起来似乎很可耻。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
回答
我建议我们着眼于编写一个Schema Importer Extension,可以用来控制代理代码的生成。此方法可用于(优美地)解决问题,而不会造成麻烦(例如,将对象从一个名称空间复制到另一个名称空间,或者修改代理生成的reference.cs类,仅在下一次更新Web参考时替换它)。
这是关于这个主题的(非常)好的教程:
http://www.microsoft.com/belux/msdn/nl/community/columns/jdruyts/wsproxy.mspx