如何从Web服务代理类转换为DataSet的类中恢复类?

时间:2008-12-15 18:16:55

标签: c# .net web-services

背景

我在Visual Studio中创建了一个Web服务,我正在尝试使用自动生成的代理类来使用它。 Web Service返回我已实现的类,其中包含List。

问题

代理类已自动生成将SOAP发送到Web服务的方法。它使用Invoke()方法执行调用,然后将结果转换为DataSet。我怎样才能将这个对象带回到我所知道的类中?

我知道我可以手动编辑自动生成的文件,但这不是很容易维护,所以我不想沿着那条路走下去(每次重建Web服务时,都必须进行更改)再次)。

有没有办法告诉生成的类更具体,实际使用正确的数据类型?或者我是否必须编写一组笨重的反序列化器来使我的数据恢复到正确的形状?

示例

我的Web Service类中的一种方法:

[WebMethod]
public UpdateList RetrieveUpdates(long sessionID, string configurationVersion, string coreVersion, string researcherDBVersion)
{ ... }

将类添加为Web引用会生成以下代理方法:

public DataSet RetrieveUpdates(long sessionID, string configurationVersion, string coreVersion, string researcherDBVersion) {
    object[] results = this.Invoke("RetrieveUpdates", new object[] {
        sessionID,
        configurationVersion,
        coreVersion,
        researcherDBVersion});
   return ((DataSet)(results[0]));
}

我从这个方法收到的DataSet总是空的(因为你不能从我的类转换为DataSet)。

提前致谢

2 个答案:

答案 0 :(得分:1)

由于Web引用生成了部分类,您应该能够向项目添加一个代理类的部分类扩展,它只重新实现有问题的方法(只需复制并粘贴它),但更改返回类型(和名称) , 当然)。如果方法签名发生更改,则必须更新扩展,但至少如果没有这样做,并且重新生成代理,则不必重新应用任何更改(并且您仍然可以使用任何其他生成的类/方法)原样)。

我之前使用过这种方法来“修复”代理类(例如,添加未在WSDL中定义的SOAP头),虽然不理想,但确实有效。

答案 1 :(得分:0)

除非您的客户端代码知道您的自定义类(例如,对程序集有引用),否则您将无法从服务中检索该类型的对象。

听起来你要做的就是在服务层共享类型。为此,您必须为您的客户端应用程序提供具有该程序集的程序集的副本 UpdateList类型,或者您需要查看类似WCF的内容。