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

时间:2008-08-09 07:34:02

标签: c# asp.net web-services

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

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

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

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