簡體   English   中英

如何使用Delphi 2010導入https webservice(wcf)?

[英]How can i import a https webservice (wcf) with Delphi 2010?

我有一個問題,所以我想幫助你。 有一個web服務,它的網址是: https//kps.saglik.gov.tr/Services/KPSTestServices.svc

我們可以輕松地在visual studio c#上導入這個url,但我們無法在delphi 2010上導入它。

我們還有來自saglik.gov.tr的用戶ID和密碼,但結果是相同的:無法導入此服務。 我們現在能做什么 ?

感謝您的任何想法。

Visual Studio示例: https//kps.saglik.gov.tr/kps_ornek1.zip


我能夠將文件導入到本地硬盤錄制中。

當我呼叫服務時,現在我得到https連接失敗錯誤。

由WCFStorm創建的Xml (http://www.wcfstorm.com/wcf/home.aspx)

Header 

POST https://kps.saglik.gov.tr/Services/KPSTestServices.svc HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Host: kps.saglik.gov.tr
Content-Length: 1256
Expect: 100-continue
Connection: Keep-Alive


<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"><s:Header><a:Action s:mustUnderstand="1">http://www.saglik.gov.tr/KPS/2011/KPSServices/TcKimlikNoIleKisiSorgula</a:Action><a:MessageID>urn:uuid:b99c1ef4-9e44-42b9-ae1f-9844bfc0f997</a:MessageID><a:ReplyTo><a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address></a:ReplyTo><a:To s:mustUnderstand="1">https://kps.saglik.gov.tr/Services/KPSTestServices.svc</a:To><o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><u:Timestamp u:Id="_0"><u:Created>2011-09-13T11:17:27.234Z</u:Created><u:Expires>2011-09-13T11:22:27.234Z</u:Expires></u:Timestamp><o:UsernameToken u:Id="uuid-d7a725d3-aa3c-4336-8651-304ecdb8d5e0-4"><o:Username>myUserName</o:Username><o:Password o:Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">myPassword</o:Password></o:UsernameToken></o:Security></s:Header><s:Body><TcKimlikNoIleKisiSorgula xmlns="http://www.saglik.gov.tr/KPS/2011"><tcNo>1842715****</tcNo></TcKimlikNoIleKisiSorgula></s:Body></s:Envelope>

響應XML

Header
HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 1519
Content-Type: application/soap+xml; charset=utf-8
Server: Microsoft-IIS/7.5
Set-Cookie: ASP.NET_SessionId=0vdbbkozgztz4falycku4gr0; path=/; HttpOnly
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Tue, 13 Sep 2011 11:19:40 GMT

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"><s:Header><a:Action s:mustUnderstand="1">http://www.saglik.gov.tr/KPS/2011/KPSServices/TcKimlikNoIleKisiSorgulaResponse</a:Action><a:RelatesTo>urn:uuid:b99c1ef4-9e44-42b9-ae1f-9844bfc0f997</a:RelatesTo><o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><u:Timestamp u:Id="_0"><u:Created>2011-09-13T11:19:41.255Z</u:Created><u:Expires>2011-09-13T11:24:41.255Z</u:Expires></u:Timestamp></o:Security></s:Header><s:Body><TcKimlikNoIleKisiSorgulaResponse xmlns="http://www.saglik.gov.tr/KPS/2011"><TcKimlikNoIleKisiSorgulaResult xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><Hata i:nil="true"/><Sonuc><Ad>MUSTAFA</Ad><AileSiraNo>12</AileSiraNo><AnaAd>LEYLA</AnaAd><BabaAd>OSMAN</BabaAd><BireySiraNo>*</BireySiraNo><CiltAd>-</CiltAd><CiltKod>-</CiltKod><Cinsiyet>Erkek</Cinsiyet><Din i:nil="true"/><DogumTarihi>21.9.0000</DogumTarihi><DogumYer>*</DogumYer><Durum>Açık</Durum><Hata i:nil="true"/><IlAd>*</IlAd><IlKod>*</IlKod><IlceAd>Abana</IlceAd><IlceKod>*</IlceKod><MedeniHal>Bekar</MedeniHal><OlumTarih>0.0.0</OlumTarih><Soyad>*</Soyad><TCKimlikNo>18427***</TCKimlikNo><Yakinlik>Kendisi</Yakinlik></Sonuc></TcKimlikNoIleKisiSorgulaResult></TcKimlikNoIleKisiSorgulaResponse></s:Body></s:Envelope>

Delphi 2010

我的請求

CONNECT kps.saglik.gov.tr:443 HTTP/1.0
User-Agent: Borland SOAP 1.2
Host: kps.saglik.gov.tr:443
Content-Length: 0
Proxy-Connection: Keep-Alive
Pragma: no-cache

沒有XML

我的回復

Header 
HTTP/1.1 502 Unable to Secure Connection
Via: 1.1 SYSTMG07
Connection: Keep-Alive
Proxy-Connection: Keep-Alive

沒有XML

您需要將delphi指向服務的WSDL。 只需將?wsdl附加到您提供的第一個URL的末尾: https ://kps.saglik.gov.tr/Services/KPSTestServices.svc?wsdl並打開此URL。

將文件另存為wsdl文件並使用以下命令導入: File - > New - > Other - > Delphi Projects - > Webservices - > WSDL Importer

請注意:當Web服務發生變化時,您需要重新導入。 此外,以這種方式使用Web服務,您可能需要在應用程序中部署wsdl,具體取決於您是否在使用Web服務時使用wsdl。

也許我對Delphi SOAP支持有點悲觀,但我認為使用C#(或Java,取決於可用的開發人員資源)編寫的“代理”服務更容易解決。

我成功地使用了“代理”解決方案來集成Microsoft Dynamics CRM系統。 經過多次嘗試在Delphi中解決它之后,我們最終編寫了一個簡單的C#應用​​程序,它從文件中讀取輸入數據(從Delphi應用程序創建),然后使用這些文件中的數據調用Web服務操作。

幸運的是,這只是一個非常簡單的單向界面。 對於高級需求,Delphi應用程序可以使用XML或JSON有效負載通過基於TCP的協議(HTTP)進行通信。 對於雙向數據交換,Delphi應用程序也必須運行HTTP服務器,這可以通過幾個代碼行中的Indy來實現。 對於雙向操作,使用消息中間件(如MSMQ(或ActiveMQ或OpenMQ等眾多開源消息代理之一))也是一個很好的解決方案,因為所有應用程序都可以脫機進行維護而不會丟失消息。

我剛剛嘗試將D2007客戶端連接到C#服務時遇到了類似的問題。 我發現的細節很有趣。 首先,德爾福進口商嚴重執行。 我切換到RemObj並繼續遇到問題。 在一天結束時,從Delphi應用程序調用WCF C#Web服務時似乎有3個感興趣的項目。 這3個項目如下......

1)確保Delphi端的Soap版本設置為1.2(這很容易)

2)生成的post命令包含不正確的操作。 需要:POST“http:// URI / Service / Command”RemObj:POST urn:HCSConnect-WSHCSConnect #Ping Delphi:--- post命令完全丟失---

我所做的是改變Rem Obj中的一些細節,使它看起來像我需要的東西

3)使用肥皂信封的服務需要一個標題區域,其中包含一些細節的定義。 在我的情況下,此標題中最重要的項目被證明是“a:Action”和“a:To”標簽。 Delphi應用程序,RemObj或其他方式中缺少這些標記。 所以在我的情況下,我正在攔截xml並將其填入。

最后兩個項目的解決方案並不那么簡單......如果你使用Rem Obj,你可以閱讀我如何修復它以及你可以做什么RemObj論壇。

http://connect.remobjects.com/discussion/825/problem-calling-web-service-built-with-c

.... 最后但並非最不重要的 ...

我也使用直接調用工作...如果你不使用RemObj和Delphi很痛苦你總是可以自己構建你的帖子和xml並發送它。 就像我在下面做的那樣...記住,發布/ xml / web它只是來回發送的純文本。

procedure TMainForm.Button5Click(Sender: TObject);
  procedure HandleError(const errorCode: integer);
  var
    errorMessage: AnsiString;
  begin
    SetLength(errorMessage, 256);
    FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_FROM_HMODULE,
                   Pointer(GetModuleHandle('wininet.dll')),
                   errorCode, 0, PChar(errorMessage), Length(errorMessage), nil);
    SetLength(errorMessage, StrLen(PChar(errorMessage)));
    raise Exception.Create(errorMessage);
  end;

  function BuildHeader: TStringStream;
  begin
    result := TStringStream.Create('');
    try
      result.WriteString('Content-Type: application/soap+xml;charset=UTF-8;action="http://Thermo.Connect/IHCSConnect/Ping"' + sLineBreak);
    except
      result.Free;
      raise;
    end;
  end;

  function BuildBody: TStringStream;
  begin
    result := TStringStream.Create('');
    with result do
      try
        WriteString('<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">' + sLineBreak);
        WriteString('<s:Header>' + sLineBreak);
        WriteString('<a:Action>http://Thermo.Connect/IHCSConnect/Ping</a:Action>' + sLineBreak);
        WriteString('<a:To>http://thermo-pc:2021/WSHCSConnect</a:To>' + sLineBreak);
        WriteString('</s:Header>' + sLineBreak);
        WriteString('<s:Body>' + sLineBreak);
        WriteString('<Ping xmlns="http://Thermo.Connect">' + sLineBreak);
        WriteString('</Ping>' + sLineBreak);
        WriteString('</s:Body>' + sLineBreak);
        WriteString('</s:Envelope>' + sLineBreak);
      except;
        result.Free;
        raise;
      end;
  end;

var
  InetRoot: HINTERNET;
  InetConnect: HINTERNET;
  Request: HINTERNET;
begin
  InetRoot := InternetOpen('GabeCode', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  try
    InetConnect := InternetConnect( InetRoot, 'thermo-pc:2021', 0, '',
                                    '', INTERNET_SERVICE_HTTP, 0, Cardinal(Self));
    try
      Request := HttpOpenRequest( InetConnect, 'POST', 'WSHCSConnect', 'HTTP/1.1', nil, nil,
                                  INTERNET_FLAG_KEEP_CONNECTION or INTERNET_FLAG_NO_CACHE_WRITE,
                                  0);
      try
        // build add header items to the post request
        with BuildHeader do
        try
          HttpAddRequestHeaders(Request, PChar(DataString), Length(DataString), HTTP_ADDREQ_FLAG_ADD);
        finally
          Free;
        end;

        // build the body of data being posted and send the post
        with BuildBody do
        try
          if not HttpSendRequest(Request, nil, 0, PChar(DataString), Length(DataString)) then
            HandleError(GetLastError);
        finally
          Free;
        end;

      finally
        InternetCloseHandle(Request);
      end;
    finally
      InternetCloseHandle(InetConnect);
    end;
  finally
    InternetCloseHandle(InetRoot);
  end;
end;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM