3

私は問題を抱えているので、あなたから助けてもらいたいです。Web サービスがあり、その URL は次のとおりです: https://kps.saglik.gov.tr/Services/KPSTestServices.svc

この URL は Visual Studio C# では簡単にインポートできますが、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 なし

4

3 に答える 3

2

Delphi をサービスの WSDL に向ける必要があります。最初に指定した URL の末尾に ?wsdl を追加するだけです: https://kps.saglik.gov.tr/Services/KPSTestServices.svc?wsdlして、この URL を開きます。

ファイルを wsdl ファイルとして保存し、 -> -> -> -> -> を使用FileNewOtherインポートDelphi ProjectsWebservicesますWSDL Importer

注: Web サービスが変更された場合は、再インポートする必要があります。また、この方法で Web サービスを使用すると、Web サービスを使用するときに wsdl を使用しているかどうかに応じて、アプリケーションで wsdl をデプロイする必要がある場合があります。

于 2011-09-13T13:49:19.270 に答える
0

D2007 クライアントを C# サービスに接続しようとして同様の問題が発生しました。私が見つけた詳細は興味深いものでした。まず第一に、Delphi インポータのパフォーマンスが著しく低下しました。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) 私が使用していたサービスでは、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;
于 2012-01-09T20:21:48.373 に答える
0

私は Delphi SOAP のサポートについて少し悲観的かもしれませんが、C# (または利用可能な開発者リソースによっては Java) で記述された「プロキシ」サービスを使用すると、これを解決する方が簡単になると思います。

Microsoft Dynamics CRM システムの統合に「プロキシ」ソリューションを使用して成功しました。Delphi でこの問題を解決しようと何度も試みた結果、最終的に、(Delphi アプリから作成された) ファイルから入力データを読み取り、これらのファイルのデータを使用して Web サービス操作を呼び出す単純な C# アプリケーションを作成しました。

幸いなことに、これは非常に単純な一方向のインターフェイスにすぎませんでした。高度な要件の場合、Delphi アプリは、XML または JSON ペイロードを使用して、TCP ベースのプロトコル (HTTP) 経由で通信できます。双方向のデータ交換の場合、Delphi アプリケーションは HTTP サーバーも実行する必要がありますが、これは Indy で数行のコード行で実装できます。双方向操作の場合、MSMQ などのメッセージング ミドルウェア (または ActiveMQ や OpenMQ などの多くのオープン ソース メッセージ ブローカーの 1 つ) を使用することも適切なソリューションです。これは、すべてのアプリケーションをメンテナンスのためにオフラインにすることができ、メッセージ損失の危険がないからです。

于 2011-09-14T07:29:20.313 に答える