我如何导入一个https web服务(wcf)与Delphi 2010



我有一个问题,所以我想从你那里得到帮助。有一个webservice,它的url是:https://kps.saglik.gov.tr/Services/KPSTestServices.svc

我们可以很容易地在visual studio c#中导入这个url,但是我们不能在delphi 2010中导入它。

我们也有一个用户id和密码从saglikk .gov.tr,但结果是一样的:不能导入此服务。我们现在能做什么?

感谢你目前提供的任何想法。

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


我可以导入文件到你的本地硬盘记录。

  • https://kps.saglik.gov.tr/Services/KPSTestServices.svc?wsdl = services.wsdl
  • https://kps.saglik.gov.tr/Services/KPSTestServices.svc?wsdl=wsdl0 = secondry.wsdl
  • https://kps.saglik.gov.tr/Services/KPSTestServices.svc?xsd=xsd0 = xsd0.xsd
  • https://kps.saglik.gov.tr/Services/KPSTestServices.svc?xsd=xsd1 = xsd1.xsd
  • https://kps.saglik.gov.tr/Services/KPSTestServices.svc?xsd=xsd2 = xsd2.xsd

当我调用服务,现在我得到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"rebj: POST:HCSConnect-WSHCSConnect#PingDelphi:——post命令完全丢失——

我所做的是改变一些细节在Rem对象的东西,使它看起来像我需要的

3)对于我正在使用的服务,soap信封需要一个包含一些细节定义的标题区域。在我的情况下,这个标题中最重要的项是"a:Action"one_answers"a: to"标签。这些标签在Delphi应用程序、RemObj或其他应用程序中是缺失的。所以在我的情况下,我拦截xml并填充它。

最后两项的解决方法并不那么简单……如果你正在使用RemObj,你可以阅读我是如何修复它的,你可以做什么在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;

相关内容

最新更新