不使用服务引用动态地使用HttpWebRequest消费Web服务

3
我工作的应用程序需要向外部系统发送数据。该系统将具有 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/,它会引发内部服务器错误。

请分享如何在这里实现通用性。


你能展示一下导致错误的请求吗? - Rao
技术专家,你有机会看一下答案,看看是否有帮助吗? - Rao
时间已经过去了,但也许这个链接可以帮助到某些人:http://www.diogonunes.com/blog/calling-a-web-method-in-c-without-a-service-reference/ - SeeSharp
1个回答

0

问题似乎出在您使用的请求数据上。请求未通过验证,因此出现了错误。

如果您导入提供的wsdl并验证创建请求,则可以清楚地看到问题所在。

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

这是模式参考,其中包含simpleType restriction

   <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位数字。

按照上述模式更改您的请求,就应该没问题了。

希望这有帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接