我的C#app不会给我任何东西,只有SOAP调用的结果为空。
我们已经使用SOAP Web服务公开了一些PeopleSoft ERP数据。
我从Visual Studio 2012 ASP.NET C#应用程序访问此SOAP服务。我有一个名为 CampusDirectoryService 的服务引用,它使用ERP生成的WSDL构建。
这是C#代码:
var service = new CampusDirectoryService.TEST_PortTypeClient();
var input = new CampusDirectoryService.InputParameters();
input.First_Name = FirstNameBox.Text;
input.Last_Name = LastNameBox.Text;
var returnData = service.TEST_OP(input);
问题是returnData
始终为空。通过Wireshark,我确认我实际上是通过数据获得有效的SOAP响应。 returnData
不应该为空。
我已经通过soapUI确认了SOAP服务的正确有效结果。提交.NET发送的完全相同的SOAP请求(我将其复制出Wireshark),我得到了预期的结果。
这是SOAP请求:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<InputParameters xmlns="http://xmlns.oracle.com/Enterprise/Tools/schemas">
<Last_Name xmlns="">cambre</Last_Name>
<First_Name xmlns="">aren</First_Name>
</InputParameters>
</s:Body>
</s:Envelope>
这是SOAP响应,ReturnID
元素中的一些内部数据被混淆或删除:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<root xmlns="http://peoplesoft.com/rootResponse">
<ReturnID>
<PRF_Name>Cambre,Aren</PRF_Name>
<Camp_Email>valid@email.com</Camp_Email>
</ReturnID>
</root>
</soapenv:Body>
</soapenv:Envelope>
TEST_OP
方法的返回类型为CampusDirectoryService.rootReturnID[]
。
为什么returnData
始终为空?
更新 根据评论,我使用soapUI验证了消息。它通过这条消息对响应进行了嘎嘎叫:
第-1行:缺少名称为[{http://xmlns.oracle.com/Enterprise/Tools/schemas} root]的消息部分
这里是响应的XSD:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://xmlns.oracle.com/Enterprise/Tools/schemas" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="ReturnID">
<xs:complexType>
<xs:sequence>
<xs:element name="PRF_Name" type="xs:string" />
<xs:element name="Camp_Email" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
XSD是否应该验证soapenv:Body
内的内容,还是应该验证整个响应,包括soapenv:Envelope
和soapenv:Body
元素?看起来soapUI希望XSD验证整个响应,而不仅仅是soapenv:Body
内的内容。
这是WSDL:
<wsdl:definitions name="TEST.1" targetNamespace="http://xmlns.oracle.com/Enterprise/HCM/schemas/TEST.1" xmlns:U_IT_CAMDIR_REQUEST_MSG.VERSION_1="http://xmlns.oracle.com/Enterprise/Tools/schemas" xmlns:U_IT_CAMDIR_RESPONSE_MSG.VERSION_1="http://xmlns.oracle.com/Enterprise/Tools/schemas" xmlns:plnk="http://schemas.xmlsoap.org/ws/2003/05/partner-link/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://xmlns.oracle.com/Enterprise/HCM/schemas/TEST.1" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsp="http://schemas.xmlsoap.org/ws/2002/12/policy">
<wsp:UsagePolicy wsdl:Required="true"/>
<plnk:partnerLinkType name="TEST_PartnerLinkType">
<plnk:role name="TEST_Provider">
<plnk:portType name="tns:TEST_PortType"/>
</plnk:role>
</plnk:partnerLinkType>
<wsdl:types>
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:import namespace="http://xmlns.oracle.com/Enterprise/Tools/schemas" schemaLocation="U_IT_CAMDIR_REQUEST_MSG.VERSION_1.xsd"/>
<xsd:import namespace="http://xmlns.oracle.com/Enterprise/Tools/schemas" schemaLocation="U_IT_CAMDIR_RESPONSE_MSG.VERSION_1.xsd"/>
</xsd:schema>
</wsdl:types>
<wsdl:message name="U_IT_CAMDIR_REQUEST_MSG.VERSION_1">
<wsdl:documentation>People Directory</wsdl:documentation>
<wsdl:part element="U_IT_CAMDIR_REQUEST_MSG.VERSION_1:InputParameters" name="parameter"/>
</wsdl:message>
<wsdl:message name="U_IT_CAMDIR_RESPONSE_MSG.VERSION_1">
<wsdl:documentation>People Directory</wsdl:documentation>
<wsdl:part element="U_IT_CAMDIR_RESPONSE_MSG.VERSION_1:root" name="parameter"/>
</wsdl:message>
<wsdl:portType name="TEST_PortType">
<wsdl:operation name="TEST_OP">
<wsdl:documentation>TEST</wsdl:documentation>
<wsdl:input message="tns:U_IT_CAMDIR_REQUEST_MSG.VERSION_1" name="U_IT_CAMDIR_REQUEST_MSG.VERSION_1"/>
<wsdl:output message="tns:U_IT_CAMDIR_RESPONSE_MSG.VERSION_1" name="U_IT_CAMDIR_RESPONSE_MSG.VERSION_1"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="TEST_Binding" type="tns:TEST_PortType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="TEST_OP">
<soap:operation soapAction="TEST_OP.v1" style="document"/>
<wsp:Policy wsu:Id="UsernameTokenSecurityPolicyPasswordOptional" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsp:ExactlyOne>
<wsp:All>
<wsse:SecurityToken wsp:Usage="wsp:Required" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:TokenType>wsse:UserNameToken</wsse:TokenType>
<Claims>
<SubjectName MatchType="wsse:Exact"/>
<UsePassword wsp:Usage="wsp:Optional"/>
</Claims>
</wsse:SecurityToken>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
<wsdl:input name="U_IT_CAMDIR_REQUEST_MSG.VERSION_1">
<soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="literal"/>
</wsdl:input>
<wsdl:output name="U_IT_CAMDIR_RESPONSE_MSG.VERSION_1">
<soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="TEST">
<wsdl:documentation>TEST</wsdl:documentation>
<wsdl:port binding="tns:TEST_Binding" name="TEST_Port">
<soap:address location="http://domainname.com/longurltoSOAPservicehere"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
答案 0 :(得分:6)
好的,我想我找到了解决这个完全相同问题的方法。我找到了解决这个问题,有两个主要项目需要正确配置。
确保在服务上设置命名空间(PeopleTools&gt; Integration Broker&gt; Integration Setup&gt; Service)。在我的作品中,我使用了名称空间:
http://xmlns.oracle.com/Enterprise/EnterprisePortal/services
创建模式及其使用的命名空间非常重要。每个模式都需要基于PeopleSoft返回消息的方式的特殊命名空间格式和消息格式。对我来说,我使用了以下模式:
示例请求消息架构: (我使用的请求消息是IS_CL_COMPLETEPERCENTAGE_REQ.V1)
<?xml version="1.0"?>
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://xmlns.oracle.com/Enterprise/EnterprisePortal/services/IS_CL_COMPLETEPERCENTAGE_REQ.V1" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="IS_CL_COMPLETEPERCENTAGE_REQ">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="USER_ID" type="xsd:string"/>
<xsd:element name="CHECKLIST_TYPE" type="xsd:string"/>
<xsd:element name="CHECKLIST_ID" type="xsd:string"/>
<xsd:element name="CHECKLIST_INSTANCE_ID" type="xsd:integer"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
示例响应消息架构: (我使用的响应消息是IS_CL_COMPLETEPERCENTAGE_RES.V1)
<?xml version="1.0"?>
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://peoplesoft.com/IS_CL_COMPLETEPERCENTAGE_RESResponse" xmlns:tns="http://peoplesoft.com/IS_CL_COMPLETEPERCENTAGE_RESResponse" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="IS_CL_COMPLETEPERCENTAGE_RES">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="PERCENTCOMPLETE" type="xsd:integer"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
使用此信息发布我的Web服务后,SoapUI验证了请求和响应,没有出现问题。
示例SOAP请求消息:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:is="http://xmlns.oracle.com/Enterprise/EnterprisePortal/services/IS_CL_COMPLETEPERCENTAGE_REQ.V1" xmlns:sch="http://xmlns.oracle.com/Enterprise/Tools/schemas">
<soapenv:Header/>
<soapenv:Body>
<is:IS_CL_COMPLETEPERCENTAGE_REQ>
<is:USER_ID>999999</is:USER_ID>
<is:CHECKLIST_TYPE>GRP</is:CHECKLIST_TYPE>
<is:CHECKLIST_ID>NEW_HIRE_CHECKLIST</is:CHECKLIST_ID>
<is:CHECKLIST_INSTANCE_ID>0</is:CHECKLIST_INSTANCE_ID>
</is:IS_CL_COMPLETEPERCENTAGE_REQ>
</soapenv:Body>
</soapenv:Envelope>
示例SOAP响应消息:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<IS_CL_COMPLETEPERCENTAGE_RES xmlns="http://peoplesoft.com/IS_CL_COMPLETEPERCENTAGE_RESResponse">
<PERCENTCOMPLETE>33</PERCENTCOMPLETE>
</IS_CL_COMPLETEPERCENTAGE_RES>
</soapenv:Body>
</soapenv:Envelope>
答案 1 :(得分:1)
来自Oracle PT8.50.00中的错误ID 11560861解决了该问题
在PT 8.50中 脚步: A.重新创建答复消息的架构: 1. Peopletools>集成代理>集成设置>消息。 2.选择COMBO_CF_EDIT_REPLY消息。 3.选中“包括名称空间”复选框。 4.保存。
B。重新生成WSDL: 1. Peopletools>集成代理> Web服务。 2.选择COMBO_CF_EDIT_REQUEST服务操作。 3.继续使用“提供Web服务”向导来生成WSDL。
在升级到8.50之前,有三种解决方法:
A.修改WSDL:
1.从PeopleTools生成WSDL,然后保存到文件。
2.通过修改答复以包含条目来更新WSDL文件
替换生成的: xmlns =“ http://xmlns.oracle.com/Enterprise/FSCM/schema/COMBO_CF_EDIT_REPLYResponse”>“
然后将WSDL文件读回到存储库中。 Peopletools>集成代理> Web服务>使用Web服务。
或 B.将基于行集的消息转换为容器/零件行集消息。
要创建容器/行集零件消息,请参阅: PeopleBook:PeopleSoft Integration Broker>管理消息>管理消息部分 PeopleBook:PeopleSoft Integration Broker>管理消息>管理容器消息
修改服务操作以引用容器消息。
或 C.通过XSLT或PeopleCode转换出站响应消息以匹配WSDL是将实际响应xmlns调整为期望值的另一种方法。