使用HttpWebRequest动态地消费web服务,而不需要服务引用

本文关键字:服务 不需要 引用 web HttpWebRequest 动态 使用 | 更新日期: 2023-09-27 18:15:59

我工作的应用程序必须将数据发送到外部系统。系统系统将有一个web服务(c#或java或php),我需要消费它。由于外部系统和客户端一样多,因此我需要获取WSDL文件、方法名和参数作为用户输入,并将数据发送到外部系统。

所以,我正在尝试使用这里可用的代码动态调用web服务

我在这里测试了一些免费的web服务

我从WSDL文件中找到SOAP位置、方法名和参数,并给出相同的输入。

以下服务按预期工作

http://soaptest.parasoft.com/calculator.wsdl
Location - http://ws1.parasoft.com/glue/calculator
Method Name - add
Parameter - x,y

但是当我通过提供SOAP位置和方法名对另一个免费服务进行相同的尝试时,它抛出500内部服务器错误。

http://www.predic8.com:8080/crm/CustomerService?wsdl
Location - http://www.predic8.com:8080/crm/CustomerService
Method Name - getAll

我通过在soapUI中测试上述wsdl来确认这些输入是正确的。在soapUI请求窗口中使用相同的位置。

我不确定为什么它抛出错误。请帮我理解一下。

还请让我知道是否可以从WSDL文件中获取服务位置并使用HttpWebRequest来获取响应。我担心这种调用web服务的方法是否能够工作,而不管用于实现web服务的技术是什么。

编辑:

问题似乎与SOAP信封有关。

对于http://soaptest.parasoft.com/calculator.wsdl,即使我们忽略xmlns:cal="http://www.parasoft.com/wsdl/calculator/,它也会成功执行。

但是对于http://www.predic8.com:8080/crm/CustomerService?wsdl,如果我忽略xmlns:ns="http://predic8.com/wsdl/crm/CRMService/1/,它会抛出内部服务器错误。

请分享一下我是如何做到这一点的

使用HttpWebRequest动态地消费web服务,而不需要服务引用

问题似乎与您正在使用的请求数据有关。请求验证失败,错误也失败。

如果您导入了提供的wsdl,并验证了创建请求,那么问题就很明显了。

PersonCustomer下有一个元素id,数据必须遵循模式../common/1下定义的模式

下面是模式引用,它具有simpleType 限制:

   <xsd:simpleType name="IdentifierType">
      <xsd:annotation>
         <xsd:documentation>Identifier for business objects.</xsd:documentation>
      </xsd:annotation>
      <xsd:restriction base="xsd:string">
         <xsd:pattern value="[A-Z]{2}-'d{5}"/>
      </xsd:restriction>
   </xsd:simpleType>

因此,id的值应该类似于AA-12345,即两个大写字母,连字符(-),后面跟着5个数字。

按照上面的模式改变你的请求,你应该会很好。

希望对大家有帮助