C# SOAP返回数据,但C表示空响应
我的C应用程序只提供来自SOAP调用的空结果 我们使用SOAP web服务公开了一些PeopleSoft ERP数据 我正在从Visual Studio 2012 ASP.NET C应用程序访问此SOAP服务。我有一个名为CampudDirectoryService的服务引用,它是使用ERP生成的WSDL构建的 以下是C代码:C# SOAP返回数据,但C表示空响应,c#,xml,web-services,soap,peoplesoft,C#,Xml,Web Services,Soap,Peoplesoft,我的C应用程序只提供来自SOAP调用的空结果 我们使用SOAP web服务公开了一些PeopleSoft ERP数据 我正在从Visual Studio 2012 ASP.NET C应用程序访问此SOAP服务。我有一个名为CampudDirectoryService的服务引用,它是使用ERP生成的WSDL构建的 以下是C代码: var service = new CampusDirectoryService.TEST_PortTypeClient(); var input = new Campu
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不应为空
我也通过确认了SOAP服务的正确有效结果。提交与.NET发送的SOAP请求完全相同的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>
TEST_OP方法的返回类型是CampusDirectoryService.rootReturnID[]
为什么returnData总是空的
更新
根据评论,我用soapUI验证了消息。它正在用以下消息对响应发出嘎嘎声:
第1行:缺少名为[{}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>
好的,我想我找到了解决这个问题的方法。我发现要解决这个问题,必须正确配置两个主要项目 确保在服务PeopleTools>IntegrationBroker>IntegrationSetup>service上设置名称空间。在我的示例中,我使用了以下名称空间:
http://xmlns.oracle.com/Enterprise/EnterprisePortal/services
如何创建模式及其使用的名称空间非常重要。根据PeopleSoft返回消息的方式,每个模式都需要特殊的名称空间格式和消息格式。对于我的模式,我使用了以下模式:
请求消息架构示例:
我使用的请求消息是\u CL\u completeepercentage\u 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>
响应消息架构示例:
我使用的响应消息是\u CL\u completeepercentage\u 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请求消息示例:
SOAP响应消息示例:
来自甲骨文
该问题由PT8.50.00中的Bug ID 11560861解决
第8.50部分
步骤:
A.重新创建回复消息的架构:
1.Peopletools>集成代理>集成设置>消息。
2.选择组合\u CF\u编辑\u回复消息。
3.选中包含名称APCE复选框。
4.保存
B.重新生成WSDL:
1.Peopletools>集成代理>Web服务。
2.选择组合\u CF\u编辑\u请求服务操作。
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集成代理>管理消息>管理消息部分
PeopleBook:PeopleSoft集成代理>管理消息>管理容器消息
修改服务操作以引用容器消息
然后生成一个新的WSDL。
修改处理程序Peoplecode以利用Parts消息的方法。
请参阅:PeopleBook:PeopleCodeAPI参考>消息类>
%第%部分方法
或
C.通过XSLT或PeopleCode转换出站响应消息以匹配WSDL是将实际响应xmlns调整为预期值的另一种方法。您是否使用了soapUI的验证功能右键单击请求或响应>验证Alt+V以确保请求和响应根据WSDL定义有效?有一件事看起来很简单xmlns的缺点是:请求有一个用于InputParameters的URL,其中的元素为空,然后响应有一个用于所有元素的完全不同的URL。当然,这可能是WSDL的定义,但它确实看起来很奇怪。@TimS.:谢谢。我在响应中遇到此验证错误:第1行:缺少名为的消息部分[{http://xmlns.oracle.com/Enterprise/Tools/schemas}根]。将进一步调查。@TimS.:我添加了XSD。这可能有助于澄清问题。@TimS:我认为你关于名称空间的理论是正确的。响应中引用的XMLNS在WSDL中没有提到。
<?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>
<?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>
<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>
<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>