0

TLS を使用して SOAP 1.1 Web サービスに接続しようとしています。証明書は正しく設定されており、Web サービスと通信できます。

ただし、VS2010 によって生成されたプロキシクラスを使用して、プレーンな C# プロジェクトを使用してこれを実行しようとすると、空のタグが要求に含まれていないため、要求が不完全であるように見えます。次に、「これは操作の実装によって生成されたエラーです」というエラーが発生し、Fiddler で表示できます

次に、SoapUI を使用してリクエストを開始しようとすると、Web サービスから正常な応答が返されます。

Fiddler を使用して両方のリクエストを比較したところ、C# リクエストは非常に単純で、C# クラスに入力された要素のみを送信していることに気付きました。しかし、SoapUI リクエストを確認すると、このリクエストには WSDL/XSD で定義されたすべての要素が含まれていましたが、それらは空でした。

Web サービスが私の要求を受け入れるかどうかを確認するために、空の要素を含めるように C# クライアントを構成する方法を理解しようとしていますが、そのような設定を見つけることができませんでした。

C# 要求応答:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Body>
    <SOAP-ENV:Fault>
      <faultcode xmlns="">
        SOAP-ENV:Server
      </faultcode>
      <faultstring xmlns="">
        This is an operation implementation generated fault
      </faultstring>
      <faultactor xmlns=""/>
      <detail xmlns="">
        <ns:SOAPFault xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="urn:xxx:xxx:data:soapfault:1:standard" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema">
          <ns:ErrorCode>2.0</ns:ErrorCode>
          <ns:ErrorText>XML schema validation error</ns:ErrorText>
          <ns:ErrorDetails>
            /{urn:xxx:xxx:service:contractcancellation:1:standard}ContractCancellationRequestEnvelope[1]/part1[1]/ContractCancellationRequestEnvelope[1]/BusinessDocumentHeader[1]/Destination[1] 
          </ns:ErrorDetails>
        </ns:SOAPFault>
      </detail>
    </SOAP-ENV:Fault>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

C# リクエスト:

POST xx HTTP/1.1
Content-Type: text/xml; charset=utf-8
SOAPAction: "urn:ContractCancellationRequestEnvelope"
Host: xx
Content-Length: 887
Expect: 100-continue
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

<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">
    <ContractCancellationRequestEnvelope xmlns="urn:xxx:xxx:data:contractcancellationrequest:1:standard">
      <Portaal_Content>
        <Portaal_MeteringPoint>
          <EANID>xxx</EANID>
          <MPCommercialCharacteristics>
            <ContractCancellationDate>
              2013-11-15
            </ContractCancellationDate>
          </MPCommercialCharacteristics>
          <Portaal_Mutation>
            <Initiator>xxx</Initiator>
            <Dossier>
              <ID>TST0000001</ID>
            </Dossier>
          </Portaal_Mutation>
        </Portaal_MeteringPoint>
      </Portaal_Content>
    </ContractCancellationRequestEnvelope>
  </s:Body>
</s:Envelope>

SoapUI リクエスト:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:xxx:xxx:data:contractcancellationrequest:1:standard">
   <soapenv:Header/>
   <soapenv:Body>
      <urn:ContractCancellationRequestEnvelope>
         <urn:BusinessDocumentHeader>
            <!--Optional:-->
            <urn:ContentHash>?</urn:ContentHash>
            <!--Optional:-->
            <urn:ConversationID>?</urn:ConversationID>
            <!--Optional:-->
            <urn:CorrelationID>?</urn:CorrelationID>
            <urn:CreationTimestamp>?</urn:CreationTimestamp>
            <!--Optional:-->
            <urn:DocumentID>?</urn:DocumentID>
            <!--Optional:-->
            <urn:ExpiresAt>?</urn:ExpiresAt>
            <urn:MessageID>?</urn:MessageID>
            <!--Optional:-->
            <urn:ProcessTypeID>?</urn:ProcessTypeID>
            <!--Optional:-->
            <urn:RepeatedRequest>?</urn:RepeatedRequest>
            <!--Optional:-->
            <urn:TestRequest>?</urn:TestRequest>
            <urn:Destination>
               <urn:Receiver>
                  <!--Optional:-->
                  <urn:Authority>?</urn:Authority>
                  <!--Optional:-->
                  <urn:ContactTypeIdentifier>?</urn:ContactTypeIdentifier>
                  <urn:ReceiverID>?</urn:ReceiverID>
               </urn:Receiver>
               <!--Optional:-->
               <urn:Service>
                  <!--Optional:-->
                  <urn:ServiceMethod>?</urn:ServiceMethod>
                  <!--Optional:-->
                  <urn:ServiceName>?</urn:ServiceName>
               </urn:Service>
            </urn:Destination>
            <!--Optional:-->
            <urn:Manifest>
               <urn:NumberofItems>?</urn:NumberofItems>
               <!--1 or more repetitions:-->
               <urn:ManifestItem>
                  <!--Optional:-->
                  <urn:Description>?</urn:Description>
                  <!--Optional:-->
                  <urn:LanguageCode>?</urn:LanguageCode>
                  <urn:MimeTypeQualifierCode>?</urn:MimeTypeQualifierCode>
                  <urn:UniformResourceIdentifier>?</urn:UniformResourceIdentifier>
               </urn:ManifestItem>
            </urn:Manifest>
            <urn:Source>
               <!--Optional:-->
               <urn:Authority>?</urn:Authority>
               <!--Optional:-->
               <urn:ContactTypeIdentifier>?</urn:ContactTypeIdentifier>
               <urn:SenderID>?</urn:SenderID>
            </urn:Source>
         </urn:BusinessDocumentHeader>
         <urn:Portaal_Content>
            <urn:Portaal_MeteringPoint>
               <urn:EANID>?</urn:EANID>
               <urn:MPCommercialCharacteristics>
                  <urn:ContractCancellationDate>?</urn:ContractCancellationDate>
               </urn:MPCommercialCharacteristics>
               <urn:Portaal_Mutation>
                  <!--Optional:-->
                  <urn:ExternalReference>?</urn:ExternalReference>
                  <urn:Initiator>?</urn:Initiator>
                  <!--Optional:-->
                  <urn:Dossier>
                     <urn:ID>?</urn:ID>
                  </urn:Dossier>
               </urn:Portaal_Mutation>
            </urn:Portaal_MeteringPoint>
         </urn:Portaal_Content>
      </urn:ContractCancellationRequestEnvelope>
   </soapenv:Body>
</soapenv:Envelope>

ご覧のとおり、要素が空であっても、SoapUI 要求ははるかに完全です。

C# コード (重要な部分):

_binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);
_binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;

_endpoint = new EndpointAddress(endpointAddress + "xxx");

_proxy = new ContractCancellationPortTypeClient(_binding, _endpoint);
_proxy.ClientCredentials.ClientCertificate.SetCertificate(
       StoreLocation.LocalMachine,
       StoreName.My,
       X509FindType.FindBySubjectName,
       "xxx");
_proxy.ContractCancellation(new ContractCancellationRequestEnvelope()
       { Portaal_Content = new ContractCancellationRequestEnvelope_PC()
           { Portaal_MeteringPoint = new ContractCancellationRequestEnvelope_PC_PMP()
               { EANID = request.EanId,
                 MPCommercialCharacteristics = new ContractCancellationRequestEnvelope_PC_PMP_MPCC()
                   { ContractCancellationDate = request.ContractCancellationDate },
                 Portaal_Mutation = new ContractCancellationRequestEnvelope_PC_PMP_PM()
                   { Initiator = request.SupplierEanId,
                     Dossier = new ContractCancellationRequestEnvelope_PC_PMP_PM_Dossier()
                       { ID = "TST0000001" }
                   }
               }
           });
4

1 に答える 1

1

あなたのコードでは、のPortaal_Content部分を生成していますが、その部分は生成してContractCancellationRequestEnvelopeいませんBusinessDocumentHeader

BusinessDocumentHeader(C# 経由で) 受信したエラーを見ると、欠落しているセクションに 1 つ以上の必須要素があると思います。

エラー テキストはXML schema validation errorで、エラーの詳細は次のとおりです。

ContractCancellationRequestEnvelope[1]/part1[1]/ContractCancellationRequestEnvelope[1]/BusinessDocumentHeader[1]/Destination[1]

必要な要素がすべて SOAP メッセージに含まれていることを確認する必要があります。

編集

このような何かがうまくいくはずです:

ContractCancellationRequestEnvelope reqMsg = new ContractCancellationRequestEnvelope();

reqMsg.BusinessDocumentHeader = new BusinessDocumentHeader()
    { CorrelationTimestamp = "?",
      MessageID = "?" };
reqMsg.BusinessDocumentHeader.Destination = new Destination();
reqMsg.BusinessDocumentHeader.Receiver = new Receiver()
    { ReceiverID = "?" };

等々。基本的に、必要なすべての要素を必ず作成してください。

ちなみに、ネストされた自動初期化を行うことができます (投稿したコードのように)。読みやすくするために、例ではより明示的なルートを使用しました。

サービスの WSDL は、何が必須かオプションかを示します。

さらにヘルプが必要な場合は、サービスの URL を提供するか、WSDL を投稿してください。

于 2013-04-27T23:01:49.867 に答える