【问题标题】:How can i import a https webservice (wcf) with Delphi 2010?如何使用 Delphi 2010 导入 https 网络服务 (wcf)?
【发布时间】:2011-09-13 10:46:28
【问题描述】:

我有一个问题,所以我想得到你的帮助。 有一个网络服务,它的网址: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


我能够将文件导入到您的本地硬盘记录中。

当我调用 service 时,现在我收到 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>

德尔福 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

【问题讨论】:

标签: wcf web-services delphi ws-security wshttpbinding


【解决方案1】:

您需要将 delphi 指向服务的 WSDL。只需将 ?wsdl 附加到您提供的第一个 URL 的末尾:https://kps.saglik.gov.tr/Services/KPSTestServices.svc?wsdl 并打开此 URL。

将文件保存为 wsdl 文件并使用以下命令导入:File -> New -> Other -> Delphi Projects -> Webservices -> WSDL Importer

请注意:当网络服务发生变化时,您需要重新导入。此外,以这种方式使用 web 服务,您可能需要将 wsdl 部署到您的应用程序中,这取决于您在使用 web 服务时是否使用 wsdl。

【讨论】:

    【解决方案2】:

    也许我对 Delphi SOAP 支持有点悲观,但我认为使用 C#(或 Java,取决于可用的开发人员资源)编写的“代理”服务会更容易解决。

    我已成功使用“代理”解决方案来集成 Microsoft Dynamics CRM 系统。在 Delphi 中多次尝试解决后,我们终于编写了一个简单的 C# 应用程序,它从文件(从 Delphi 应用程序创建)中读取输入数据,然后使用这些文件中的数据调用 Web 服务操作。

    幸运的是,这只是一个非常简单的单向界面。对于高级需求,Delphi 应用程序可以使用 XML 或 JSON 有效负载通过基于 TCP 的协议 (HTTP) 进行通信。对于双向数据交换,Delphi 应用程序也必须运行一个 HTTP 服务器,这可以用 Indy 用几行代码来实现。对于双向操作,使用 MSMQ 之类的消息中间件(或 ActiveMQ 或 OpenMQ 等众多开源消息代理之一)也是一个很好的解决方案,因为所有应用程序都可以离线进行维护,而不会出现消息丢失的危险。

    【讨论】:

      【解决方案3】:

      我刚刚在尝试将 D2007 客户端连接到 C# 服务时遇到了类似的问题。我发现的细节很有趣。首先德尔福进口商严重表现不佳。我切换到 RemObj 并继续遇到问题。归根结底,当从 Delphi 应用程序调用 WCF C# Web 服务时,似乎有 3 个感兴趣的项目。这3项如下...

      1) 确保在 Delphi 方面您将 Soap 版本设置为 1.2(这是最简单的版本)

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

      我所做的是更改 Rem Obj 中的一些细节,使其看起来像我需要的那样

      3) 对于我正在使用的服务,soap 信封需要一个包含一些细节定义的标题区域。在我的情况下,这个标题中最重要的项目是“a:Action”和“a:To”标签。 Delphi 应用程序、RemObj 或其他程序中缺少这些标签。因此,在我的情况下,我正在拦截 xml 并填写它。

      最后 2 项的解决方案并不是那么简单...如果您使用的是 Rem Obj,您可以阅读有关我如何修复它以及您可以做什么 RemObj 论坛。

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

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

      我还可以使用直接调用来工作...如果您不使用 RemObj 并且 Delphi 很痛苦,您总是可以自己构建您的帖子和 xml 并发送它。就像我在下面所做的那样……记住,post/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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-18
        • 1970-01-01
        • 2015-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多