2009-05-06 42 views
2

我有一个基于Web的系统,用户应该能够通过输入URL和必要的参数值从Web服务中获取数据。以编程方式获取Web服务的参数?

我的问题是,在某种程度上,我需要找出肥皂体中所需参数的结构,它不一定只是一个或两个字符串,但可能是一个完整的对象树。

传输不是问题,因为它只是简单的XML。

我该怎么做?我是否需要阅读整个WSDL Schema并试图弄清楚这一点,还是有一些更简单的方法?我知道.NET可以为它生成代码,但是我能否轻松找出哪些类不会实际生成并使用反射来找出它做了什么?

有没有人有想法?

回答

4

您可以使用ServiceDescription类,它为您提供了一个表示您的wsdl文件的对象模型。

如果你想尝试一个有用的包装,小鸡这post

+0

这可以解决我的问题,如果它不是两件事: 1。包装只获取第一级参数。如果该参数是complexType,我仍然没有得到该复杂类型的定义。但是,这可以通过对代码进行一些修改来轻松解决。 2.我正在使用的至少一个测试WSDL文件对Soap,HttpGet和HttpPost都具有绑定。我似乎无法以编程方式找出哪一个是肥皂之一。任何想法如何使用ServiceDescription类来做到这一点? – janzi 2009-05-07 08:33:56

0

我从来没有做过,但我相信.net允许您动态生成代理。你应该能够反映生成的类。除了简单的界面之外,我看不到这个工作正常。

+0

我已经试过了。但是,这会创建新的程序集,我必须加载才能反映它们。不幸的是,那些程序集不能轻易地被卸载(除非创建一个新的AppDomain),即使它们永远不会再被使用,这就是为什么我想在不实际创建和加载程序集的情况下找出参数的原因。 – janzi 2009-05-07 07:33:55

0

我看到3个选项:

a)使Web服务的发布者,并要求文档和代码示例。

b)使用Visual Studio生成代理类。然后研究生成的代码,找出如何在没有生成的代码的情况下自己做。您需要了解XMLSerializer类的工作方式,因为这是用于将生成的类型转换为XML的类。

c)阅读WSDL描述以了解预期参数及其格式。

希望这有助于

狡猾

+0

问题是,我不知道系统将提前与哪些Web服务通信。如果我知道这一点,我也可以将Web引用添加到它并使用它。我基本上试图为我的用户提供一种方式来根据需要从其他系统导入数据。 – janzi 2009-05-07 08:43:03

0

尝试使用的ChannelFactory。这将让您在运行时动态调用Web服务并创建代理客户端。我看到了关于加载和卸载程序集的注释。使用客户端代理进行反射,完成后只需处理它。

0

这个问题很难解决一般情况。如果服务的“参数”之一是XML文档会怎么样?如果它是一个复杂的类型呢?你将如何生成一个用户界面来允许输入这些东西?

你也可以看看soapUI。

顺便说一句,创建一个新的AppDomain来加载程序集并不困难。事实上,这很容易。