12

私のC#アプリは、SOAP呼び出しからnullの結果しか得られません。

いくつかのPeopleSoftERPデータをSOAPWebサービスで公開しました。

Visual Studio 2012 ASP.NET C#アプリからこのSOAPサービスにアクセスしています。ERPによって生成されたWSDLを使用して構築されたCampusDirectoryServiceという名前のサービスリファレンスがあります。

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常にnullです。Wiresharkを通じて、実際にデータを含む有効なSOAP応答を取得していることを確認しました。returnDatanullであってはなりません。

また、 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常にnullなのですか?

更新 コメントごとに、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を含む応答全体を検証することになっていますか?soapUIは、XSDが内部の内容だけでなく、応答全体を検証することを期待しているようです。soapenv:Envelopesoapenv:Bodysoapenv: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>
4

2 に答える 2

6

わかりました、これとまったく同じ問題の解決策を見つけたと思います。これを修正することがわかりました。適切に構成する必要がある主な項目が 2 つあります。

  1. サービスに名前空間を設定してください (PeopleTools > Integration Broker > Integration Setup > Service)。私の場合、次の名前空間を使用しました。

    http://xmlns.oracle.com/Enterprise/EnterprisePortal/services
    
  2. スキーマとそれらが使用する名前空間を作成する方法は非常に重要です。各スキーマには、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>
于 2012-09-10T14:04:01.903 に答える