2013-04-27 63 views
0

我試圖使用TLS連接到SOAP 1.1 Web服務。 證書已設置正確,並且可以與Web服務進行通信。但是,當我嘗試使用純C#項目來執行此操作時,使用由VS2010生成的代理類,請求似乎是不完整的,因爲空標記不在請求中。然後我得到一個「這是一個操作實現產生故障」故障,在提琴手帶默認空標籤的WCF請求

如果我再嘗試推出使用了SoapUI請求可見,我從一個web服務響應成功的。

我使用Fiddler來比較這兩個請求,並且我注意到C#請求很簡單,只發送填充在我的C#類中的元素。 但是,當我檢查了SoapUI請求,該請求包含在WSDL/XSD的定義每一個元素,即使它們是空的。

我想了解如何配置C#客戶端以包含空元素,以查看web服務是否會接受我的請求,但是我無法找到這樣的設置。

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" } 
        } 
       } 
      }); 

回答

1

在代碼中,你產生ContractCancellationRequestEnvelopePortaal_Content部分,但不是BusinessDocumentHeader部分。

如果你看看收到的故障(通過C#)我敢打賭,有一個在BusinessDocumentHeader部分中的一個或多個必需的元素缺失:

錯誤文本是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。

+0

這些是服務參考創建的類。我看不出還有什麼我應該編寫的信息? – Mortana 2013-04-27 23:16:02

+0

@Mortana - 我剛剛注意到,它看起來像你正在使用服務引用,我會盡快更新我的答案,以反映這一點。我希望那裏也有業務頭的類。給我幾分鐘,我會用建議更新我的答案。 – Tim 2013-04-27 23:17:31

+0

謝謝蒂姆!提供WSDL中指定的每個必需元素都是解決方案。我現在能夠成功地與web服務進行通信! – Mortana 2013-04-28 13:43:58