调试SOAP传输



我正在尝试使用Delphi 2010和Indy对web服务进行概念验证消费。此时我的代码是:

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;

注意:我对POST 之前的这条线路特别不确定

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

根据web服务文档,我应该得到一个ACK1成功或ACK1错误的解释。以下是我在这一点上得到的结果:

    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>

我一直在通过电话和电子邮件与维护网络服务的机构(加州EDD)联系。他们的动机是让尽可能多的人采用这项技术,减少他们必须处理的纸张数量,但他们对该系统没有深入的了解,因为它是由外部供应商创建的。

我下载了SOAPUI,试图更好地理解该服务,并消除可能由我的实现和可能滥用Indy库引起的任何错误。我不知道如何将SOAPUI用于此目的。说明书似乎没有说明我的情况。如果我将WSDL加载到程序中并尝试测试其中一个函数,我得到的结果是测试以状态[finished]结束,我不知道该怎么做。

如果能帮我解决这个小问题,我将不胜感激。

SoapUI是一种方法,它可以查看事情应该如何工作。使用RIO.OnBeforeExecute和AfterExecute事件检查正在发送和接收的XML。将它们与SoapUI发送和接收的内容进行比较。忽略名称空间中的差异,这应该无关紧要。理想情况下,您应该能够获取来自OnBeforeExecute事件的XML(将流保存到文本文件或日志中),粘贴到SoapUI中(右键单击以在SoapUI进行清理/重新格式化),并查看XML是否有意义,并查看提交时会发生什么。

如果您的XML即将工作,但需要进行"调整",则可以使用StringReplace等在OnBeforeExecute事件中编辑XML,并"修复"XML使其工作。

最新更新