2012-02-29 27 views
5

Tôi đang cố gắng thực hiện tiêu thụ bằng chứng về khái niệm dịch vụ web bằng Delphi 2010 và Indy. Mã của tôi vào thời điểm này là:Gỡ lỗi truyền SOAP

procedure TForm1.Log(const sEvent, sMsg: String); 
const sPrior: String = ''; 
begin 
    if sEvent <> sPrior then begin 
    mTraffic.Lines.Append(''); 
    mTraffic.Lines.Append(Format('%s: %s', [sEvent, FormatDateTime('mm/dd/yyyy hh:nn:ss.zzz', Now)])); 
    mTraffic.Lines.Append('--------------------------------------------------------------------------------'); 
    sPrior := sEvent; 
    end; 
    mTraffic.Lines.Append(sMsg); 
    Application.ProcessMessages; 
end; 

function TForm1.BuildRequest: String; 
const MINPERDAY = 1440; 
var slRequest: TStringList; 
    sFileName: String; 
    sID: String; 
    sGUID: String; 
    oDoc: TNativeXML; 
    oNode: TXmlNode; 
    uNow: _SystemTime; 
    dtNow: TDateTime; 
    sNow: String; 
    sNonce: String; 
    oIdmd5: TIdHashMessageDigest5; 
begin 
    sFileName := 'Send.xml'; 
    slRequest := TStringList.Create; 
    oIdmd5 := TIdHashMessageDigest5.Create; 
    oDoc := TNativeXML.Create; 
    try 
    oDoc.LoadFromFile(sFileName); 
    SetAttrib(oDoc, 'inputMessage', 'utc', FormatDateTime('m/d/yyyy hh:mm:ss am/pm', Now)); 
    sGUID := 'urn:uuid' + MyCreateUUID; 
    SetAttrib(oDoc, 'inputMessage', 'messageId', sGUID); 
    SetNode(oDoc, 'wsa:messageId', sGUID); 
    Windows.GetSystemTime(uNow); 
    dtNow := SysUtils.SystemTimeToDateTime(uNow); 
    sNow := FormatDateTime('yyyy-mm-dd"T"hh:mm:ss"Z"', dtNow); 
    sNonce := oIdmd5.HashStringAsHex(sNow + 'Jack' + 'Test' + 'Salt'); 
    SetNodes(oDoc, 'wsu:Created', FormatDateTime('yyyy-mm-dd"T"hh:mm:ss"Z"', dtNow)); 
    SetNode(oDoc, 'wsu:Expires', FormatDateTime('yyyy-mm-dd"T"hh:mm:ss"Z"', dtNow + 5 /MINPERDAY)); 
    SetNode(oDoc, 'wsse:Nonce', sNonce); 
    SetNode(oDoc, 'ElectronicPostmark', FormatDateTime('yyyy-mm-dd"T"hh:mm:ss.zz-8.00', dtNow)); 
    SetNode(oDoc, 'wsse:Username', '#MyUserName#'); 
    SetNode(oDoc, 'wsse:Password', '#MyPassword#'); 
    oDoc.XmlFormat := xfReadable; 
    Result := oDoc.WriteToString; 
    finally 
    slRequest.Free; 
    oIdmd5.Free; 
    oDoc.Free; 
    end; 

end; 

function TForm1.SSLPost(const url: String; sRequest: String): String; 
var lHTTP: TIdHTTP; 
    lIOHandler: TIdSSLIOHandlerSocketOpenSSL; 
    lIDLogDebug: TIdLogDebug; 
    ss: TStringStream; 
begin 
    lHTTP := TIdHTTP.Create(nil); 
    lIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil); 
    lIDLogDebug := TIdLogDebug.Create(nil); 
    ss := TStringStream.Create; 
    try 
    ss.WriteString(sRequest); 
    ss.Position := 0; 
    lIOHandler.SSLOptions.Method := sslvSSLv3; 
    lIOHandler.OnStatusInfo := IdSSLIOHandlerSocketOpenSSL1StatusInfo; 
    lHTTP.IOHandler := lIOHandler; 
    lIdLogDebug.OnSend := IdLogDebug1Send; 
    lIDLogDebug.OnReceive := IdLogDebug1Receive; 
    lIDLogDebug.Active := True; 
    lHTTP.Intercept := lIdLogDebug; 
    try 
     lHTTP.Request.CustomHeaders.Add('SOAPAction: "http://edd.ca.gov/SendTransmission"'); 
     Result := lHTTP.Post(url, ss); 
    except 
     On e: Exception do begin 
     Result := e.Message + #13#10 + '**No Response**'; 
     end; 
    end; 
    finally 
    lHTTP.Free; 
    lIOHandler.Free; 
    lIdLogDebug.Free; 
    ss.Free; 
    end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
var sResponse: String; 
begin 
    sResponse := SSLPost('https://FSETTESTPROD.EDD.CA.GOV', BuildRequest); 
    Log('Response', sResponse); 
end; 

Lưu ý: Tôi đặc biệt không chắc chắn về dòng này ngay trước khi POST

lHTTP.Request.CustomHeaders.Add('SOAPAction: "http://edd.ca.gov/SendTransmission"'); 

Theo tài liệu dịch vụ web, tôi nên nhận được hoặc là một thành công ACK1 hoặc một lỗi ACK1 với một lời giải thích. Đây là kết quả tôi nhận được tại thời điểm này:

SSL: 02/28/2012 16:33:55.609 
    -------------------------------------------------------------------------------- 
    SSL status: "before/connect initialization" 
    SSL status: "before/connect initialization" 
    SSL status: "SSLv3 write client hello A" 
    SSL status: "SSLv3 read server hello A" 
    SSL status: "SSLv3 read server certificate A" 
    SSL status: "SSLv3 read server done A" 
    SSL status: "SSLv3 write client key exchange A" 
    SSL status: "SSLv3 write change cipher spec A" 
    SSL status: "SSLv3 write finished A" 
    SSL status: "SSLv3 flush data" 
    SSL status: "SSLv3 read finished A" 
    SSL status: "SSL negotiation finished successfully" 
    SSL status: "SSL negotiation finished successfully" 
    Cipher: name = RC4-MD5; description = RC4-MD5     SSLv3 Kx=RSA  Au=RSA Enc=RC4(128) Mac=MD5 
    ; bits = 128; version = TLSv1/SSLv3; 

    Send: 02/28/2012 16:33:55.859 
    -------------------------------------------------------------------------------- 
    POST/HTTP/1.0 
    Content-Length: 3130 
    SOAPAction: "http://edd.ca.gov/SendTransmission" 
    Host: FSETTESTPROD.EDD.CA.GOV 
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
    Accept-Encoding: identity 
    User-Agent: Mozilla/3.0 (compatible; Indy Library) 


    <?xml version="1.0" encoding="utf-8"?> 
    <log> 
     <inputMessage utc="2/28/2012 04:32:28 pm" messageId="urn:uuid{4A995507-9E23-49C3-A17C-19C30693C6C1}"> 
     <processingStep description="Unprocessed message"> 
      <soap:Envelope xmlns:xop="http://www.w3.org/2004/08/xop/include" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
      <soap:Header> 
       <wsa:Action>http://edd.ca.gov/Sendtransmission</wsa:Action> 
       <wsa:MessageID>urn:uuid{4A995507-9E23-49C3-A17C-19C30693C6C1}</wsa:MessageID> 
       <wsa:ReplyTo> 
       <wsa:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:Address> 
       </wsa:ReplyTo> 
       <wsa:To>http://localhost:3031/EDD.DMRC.FSET.WebServices/FsetService.asmx</wsa:To> 
       <wsse:Security soap:mustUnderstand="1"> 
       <wsu:Timestamp wsu:Id="Timestamp-db31b09e-9283-4ff1-9a57-5b97971328d4"> 
        <wsu:Created>2012-02-29T00:32:28Z</wsu:Created> 
        <wsu:Expires>2012-02-29T00:37:28Z</wsu:Expires> 
       </wsu:Timestamp> 
       <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="SecurityToken-0ac2cf06-b8da-46c8-9314-8081144b09d5"> 
        <wsse:Username>#MyUserName#</wsse:Username> 
        <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">#MyPassword#</wsse:Password> 
        <wsse:Nonce>0D78327F3F671183149EEC5907A6A5F6</wsse:Nonce> 
        <wsu:Created>2012-02-29T00:32:28Z</wsu:Created> 
       </wsse:UsernameToken> 
       </wsse:Security> 
      </soap:Header> 
      <soap:Body> 
       <SendTransmission xmlns="http://edd.ca.gov/"> 
       <SendTransmissionRequest xmlns="http://www.irs.gov/a2a/mef/MeFTransmitterServiceWse.xsd"> 
        <transmissionDataList> 
        <Count>1</Count> 
        <transmissionData> 
         <transmissionId>123456789</transmissionId> 
         <ElectronicPostmark>2012-02-29T00:32:28.750-8.00</ElectronicPostmark> 
        </transmissionData> 
        </transmissionDataList> 
       </SendTransmissionRequest> 
       <fileBytes>UEsDBBQAAAAIAAaJUzYwks2W0QYAAD2IAAALAAAAREU2</fileBytes> 
       </SendTransmission> 
      </soap:Body> 
      </soap:Envelope> 
     </processingStep> 
     </inputMessage> 
    </log> 

Receive: 02/28/2012 16:33:56.234 
-------------------------------------------------------------------------------- 
HTTP/1.1 200 OK 
Connection: close 
Date: Wed, 29 Feb 2012 00:33:51 GMT 
Server: Microsoft-IIS/6.0 
X-Powered-By: ASP.NET 
Content-Length: 195 
Content-Type: text/html 
Set-Cookie: ASPSESSIONIDCQSQQDSS=BPLHDJLCKCLDKBDMLBNJOMHP; path=/ 
Cache-control: private 

<html> 
<head> 
<title>This location has been marked as available</title> 
</head> 
<body> 
<h1>AVAILABLE</h1> 
This IP address has been assigned to EDD FSET User Test web site. 
</body> 
</html> 

Response: 02/28/2012 16:33:56.281 
-------------------------------------------------------------------------------- 
<html> 
<head> 
<title>This location has been marked as available</title> 
</head> 
<body> 
<h1>AVAILABLE</h1> 
This IP address has been assigned to EDD FSET User Test web site. 
</body> 
</html> 

Tôi đã liên hệ qua điện thoại và email với cơ quan duy trì dịch vụ web (California EDD). Họ được thúc đẩy để có được càng nhiều người càng tốt để áp dụng công nghệ này và giảm lượng giấy họ phải xử lý nhưng họ không có kiến ​​thức chuyên sâu về hệ thống bởi vì nó được tạo ra bởi một nhà cung cấp bên ngoài.

Tôi đã tải SOAPUI để cố gắng hiểu dịch vụ tốt hơn và loại bỏ mọi lỗi có thể do việc triển khai và lạm dụng thư viện Indy của tôi có thể gây ra. Tôi không chắc chắn làm thế nào để sử dụng SOAPUI cho mục đích này. Các hướng dẫn dường như không giải quyết được tình huống của tôi. Nếu tôi tải WSDL vào chương trình và thử kiểm tra một trong các hàm, tôi nhận được kết quả là bài kiểm tra đã kết thúc với trạng thái [HOÀN THÀNH] và tôi không biết phải làm gì với điều đó.

Tôi sẽ đánh giá cao bất kỳ trợ giúp nào về vấn đề nhỏ của tôi.

+2

Thứ nhất, nó không phải là "một vấn đề nhỏ", từ những gì tôi hiểu bạn hầu như không có tài liệu, hãy thử nhập WSDL vào Delphi và làm theo cách của bạn từ đó, nếu WSDL Importer của Delphi sẽ nhập nó, sau đó chúng tôi có thể làm việc với điều đó ... – ComputerSaysNo

+0

@Dorin Tôi đồng ý rằng nó không phải là một vấn đề nhỏ. Đó là một nỗ lực để duy trì quan điểm. Khi tôi lần đầu tiên bắt đầu quá trình này, tôi đã sử dụng Trình nhập khẩu WSDL để xây dựng ứng dụng khách của tôi. Đó là khá sớm trong quá trình này. Tôi không hiểu thông tin liên lạc web tốt và ẩn các phần của nó trong khi cố gắng để hiểu và gỡ lỗi quá trình của tôi dường như phản tác dụng. Khi tôi đọc những người dùng khác nhận thấy rằng Nhà nhập khẩu WSDL có vấn đề và đã làm một công việc không đầy đủ, tôi đã từ bỏ nó theo một cách tiếp cận cơ bản hơn mà tôi nghĩ tôi có thể theo dõi tốt hơn. – jrodenhi

+2

từ kinh nghiệm trước đây của tôi với Delphi WSDL Importer, tôi có thể đảm bảo với bạn rằng nó không dễ dàng, nhưng bước đầu tiên là sử dụng SOAP UI để kiểm tra một số chức năng, sau đó LƯU "Yêu cầu/phản hồi" từ SOAP UI, bằng cách sử dụng nhập khẩu wsdl delphi để nhận được cùng một yêu cầu/phản hồi hoặc tương tự, sau đó tôi nghĩ chúng tôi có thể trợ giúp, nhưng nó sẽ không dễ dàng, đó là chắc chắn): – ComputerSaysNo

Trả lời

6

SoapUI là cách để đi, để xem mọi thứ hoạt động như thế nào. Sử dụng các sự kiện RIO.OnBeforeExecute và AfterExecute để kiểm tra XML mà bạn đang gửi và nhận. So sánh những gì với những gì SoapUI gửi và nhận. Bỏ qua sự khác biệt trong không gian tên, điều đó không quan trọng. Lý tưởng nhất, bạn sẽ có thể đưa XML ra khỏi sự kiện OnBeforeExecute (lưu luồng vào tệp văn bản hoặc nhật ký), dán vào SoapUI, (nhấp chuột phải để dọn dẹp/định dạng lại trong SoapUI) và xem XML có ý nghĩa và xem điều gì xảy ra khi bạn gửi điều đó.

Nếu nó chỉ ra rằng XML của bạn là gần để làm việc, nhưng một 'tinh chỉnh' là cần thiết, bạn có thể chỉnh sửa XML trong sự kiện OnBeforeExecute với StringReplace, vv, và 'sửa' XML để nó hoạt động.

+1

Cảm ơn câu trả lời, Chris. Đây sẽ là quá trình tôi làm theo bây giờ. Tôi vẫn còn một vấn đề khác nhưng tôi cần phải mở một câu hỏi khác cho nó. – jrodenhi