C# SOAP返回数据,但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

我的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 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>