HTTPRIO componenti ile giden gelen XML’lerin bulunması

Delphi’de THTTPRio componentini kullanarak webservis uygulaması geliştirirken giden ve gelen xml metinlerine ihtiyaç duyulabilir. Formumuzda HttpRio1 isimli componentimizin olduğunuz kabul ederek Giden için BeforeExecute metoduna ve Gelen için AfterExecute metoduna aşağıdaki ifadeler yazılır:


uses OPConvert;
// Giden
procedure TForm1.HTTPRIO1BeforeExecute(
const MethodName: String; var SOAPRequest: WideString);
begin
   ShowMessage(SOAPRequest);
end;
// Gelen
procedure TForm1.HTTPRIO1AfterExecute(
const MethodName: String; SOAPResponse: TStream);
var
   Str: string;
   sl : TStringList;
begin
   sl := TStringList.Create;
   SOAPResponse.Seek(0,soFromBeginning);
   sl.LoadFromStream(SOAPResponse);
   if (soUTF8EncodeXML in HTTPRIO1.Converter.Options) then
      Str:=UTF8Decode(sl.Text)
   else
     Str:=sl.Text;

   FreeAndNil(sl);
   ShowMessage(Str);
end;

WSE3 ile çalışırken WSE910,WSE065 hatası alınması

Web servis ile çalışırken bağlandığınız server’in saati ile bağlanan bilgisayarın saati arasında fark timeToleranceInSeconds (WSE3 için default değeri 300 sn.)  değerinden fazla ise “WSE910: An error happened during the processing of a response message, and you can find the error in the inner exception. You can also find the response message in the Response property.”  hatasını alırsınız.

Mesajda belirtildiği gibi InnerException’a baktığımızda  : “Microsoft.Web.Services3.Security.SecurityFault: An error was discovered processing the <Security> header —> System.Exception: WSE065: Creation time of the timestamp is in the future. This typically indicates lack of synchronization between sender and receiver clocks. Make sure the clocks are synchronized or use the timeToleranceInSeconds element in the microsoft.web.services3 configuration section to adjust tolerance for lack of clock synchronization. …

timeToleranceInSeconds değerini arttırmak için Web.config dosyasında aşağıdaki değişikliği yapıyoruz. Örnekte timeToleranceInSeconds değeri 4200 olarak atanıyor.


<?xml version="1.0"?>
<configuration>
   <configSections>
      <section name="microsoft.web.services3" type="Microsoft.Web.Services3.Configuration.WebServicesConfiguration, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
   </configSections>
    ...
    ...
    ...
   <microsoft.web.services3>
      <security>
         <timeToleranceInSeconds value="4200" />
      </security>
   </microsoft.web.services3>
</configuration>

Delphi ile web servis’e parametre gönderim problemi

ASP.NET (VS 2005) ile oluşturulmuş bir web servisine parametre gönderemedim. Parametresiz olarak çağırıldığında problem yok, parametre ile çağrıldığında, parametre değeri olarak null gidiyor ve “Value cannot be null” hatası alınıyor. 

Delphi ile oluşturulan kod içerisine

initialization

InvRegistry.RegisterInterface(TypeInfo(SoapAdi), 'http://tempuri.org/', 'utf-8');

altına:

InvRegistry.RegisterInvokeOptions(TypeInfo(SoapAdi), ioDocument);

satırını ekleyince problem çözüldü.