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

我仍然是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生成的代理类进行编程。

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

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

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

您实际上不必使用WSDL为您提供的生成的类。 如果你看看它生成的代码,它只是调用一些.NET框架类来提交SOAP请求。 在过去,我已将该代码复制到普通的.cs文件中并对其进行了编辑。 虽然我没有特别尝试过,但我没有理由不放弃代理类定义并使用原始类来接收SOAP调用的结果。 它必须已经在引擎盖下进行反思,这样做两次似乎是一种耻辱。

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

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

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