WebService zaman aşımı

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
ertank
Kıdemli Üye
Mesajlar: 1657
Kayıt: 12 Eyl 2015 12:45

WebService zaman aşımı

Mesaj gönderen ertank »

Merhaba,

Delphi 10 kullanarak WebServis ve Consume kısmlarının ikisinide kendi geliştirdiğim bir proje var. WebServis uygulaması normalde Windows Servis uygulaması şeklinde çalışıyor (ya da parametrik olarak normal pencereli uygulama olarak çalışıyor)

WebServis ile şu anda iki tane yazmaya devam ettiğim modül var. Bunların tanımları aşağıdaki gibi:

Kod: Tümünü seç

    function  Adresler: string; stdcall;
    function  GetLicense(const ClientTime: TXSDateTime; const ClientIP: string; const ClientUUID: string; const OSUserName: string; const LicenseType: string): string; stdcall;
Bu servislerden "Adresler" her zaman consume edilebilmesine karşın "GetLicense" genellikle (WebServis ilk çalıştığı ve Consume eden uygulama ilk çalıştığı ve Consume uygulamasından ilk olarak "GetLicense" modülü çağırıldığında) zaman aşımına uğrayıp aşağıdaki hata mesajını veriyor:

Kod: Tümünü seç

The operation timed out - URL:http://192.168.1.24:8080/soap/IDeneme - SOAPAction:urn:DenemeIntf-IDeneme#GetLicense
-Şu an için her iki uygulama da benim geliştirme yaptığım bilgisayar üzerinde çalışıyor.
-WebServis uygulamasının Windows servisi veya normal pencereli windows uygulaması olarak çalışması bir değişikliğe sebep olmuyor.
-Indy VCL versiyonu 10.6.2.0 (5344) internetten indirip güncelleme yaptım. Yanlış hatırlamıyor isem 2 veya 3 Mart 2016 tarihli nightly build.

Sorunu tespit edemedim. Yardımcı olabilecek arkadaşlara şimdiden çok teşekkür ederim.
gaus
Üye
Mesajlar: 227
Kayıt: 14 May 2014 07:36
İletişim:

Re: WebService zaman aşımı

Mesaj gönderen gaus »

Delphi tarafından nasıl bağlanıyorsunuz ?
ertank
Kıdemli Üye
Mesajlar: 1657
Kayıt: 12 Eyl 2015 12:45

Re: WebService zaman aşımı

Mesaj gönderen ertank »

Normalde herşey çalışıyor. Sadece program ilk çalıştığında ilk çalıştırılan modül GetLicense olursa timeout hatasına düşebiliyor. Her zaman da olmuyor.

HTTPRIO1 form üzerine yerşeltirilmiş halde. Dinamik olarak oluşturmuyorum. HTTPRIO için URL, Service ve Port gibi bilgileri zaten uygulama OnCreate kısmında doldurulmuş oluyor.

GetLicense için kullanılan büyük harfli değişkenler global ve buraya gelmeden tanımlanmış oluyor. Server tarafı gelen-giden tüm istekleri database içinde log tutuyor. Database kayıtlarında gelen parametrelerin doğru olduğunu görebiliyorum. Database kaytılarında ayrıca gelen isteklerin hepsi mutlaka cevaplanmış. Dolayısı ile server'a talep dahi ulaşmıyor gibi.

Firewall sorunu olmadığınıda teyit edebilirim. Aksi halde ikinci tıklamaların da çalışmaması lazım ancak ikinci ve takip eden tıklamalarda sorun yok. İlk olarak Adresler çağırılıp ikinci olarak GetLicense çağırılırsa da sorun yok.

Adresler modülü çağırma kodu:

Kod: Tümünü seç

var
  s:String;
begin
  try
    s          := (HTTPRIO1 as IDeneme).Adresler;
  except
    ...
  end;
end;
GetLicense modülü çağırma kodu:

Kod: Tümünü seç

var
  s,OSUser:String;
  dt:TXSDateTime;
begin
  GetCurrentUserName(OSUser);

  dt     := TXSDateTime.Create;
  try // finally
    try // except
      dt.AsDateTime := now;
      s             := (HTTPRIO1 as IDeneme).GetLicense(dt, CORRECT_CLIENT_IP, SYSTEM_UUID, OSUser, 'test');
    except
      ...
    end;
  finally
    dt.Free;
  end;
end;
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: WebService zaman aşımı

Mesaj gönderen vkamadan »

Merhabalar ,
WebServis sunucu uygulamanız tarafında ki GetLicense metodunuzun içinde yaptıkarınız zaman zaman gerçekten uzun sürebilen işlemler ise consume uygulamanız tarafında varsayılan timeout süresini makul düzeyde arttırarak sorunu çözebilirsiniz. consume uygulamanızda timeout süresini arttırmak için ;

Kod: Tümünü seç

uses WinInet ;

//HTTPRIO nesnenizin HTTPWebNode grubunu altında yer alana OnBeforePost olayına  ;

var TimeOut : integer;
begin
 TimeOut := 600000; // 10dk = (1000 * 60 * 10) ;
 InternetSetOption(Data,
      INTERNET_OPTION_RECEIVE_TIMEOUT,
      Pointer(@TimeOut),
      SizeOf(TimeOut));
end;


İyi çalışmalar.
Volkan KAMADAN
www.polisoft.com.tr
gaus
Üye
Mesajlar: 227
Kayıt: 14 May 2014 07:36
İletişim:

Re: WebService zaman aşımı

Mesaj gönderen gaus »

Merhabalar ,
Öncelikle Http rio bağlanırken sıkıntı çıkarabiliyor.Bunun gerçek sebebi Httprio dan kaynaklı olduğunu düşünebiliyorum .
Benim Wsdl bağlanma şeklim şu şekildedir.

Kod: Tümünü seç

butonclick(Sender:Tobject);
 var soap :ServiceSoap;
  sonuc:Objen//öyle diyelim:)
 begin
  soap := GetServiceSoap(false,nil,'');
  sonuc := soap.GetLicence()
 end;
 bu şekilde timeoutta düşmez.En azından bir kaç defa yaptırabilirsiniz.
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: WebService zaman aşımı

Mesaj gönderen vkamadan »

gaus yazdı:Merhabalar ,
Öncelikle Http rio bağlanırken sıkıntı çıkarabiliyor.Bunun gerçek sebebi Httprio dan kaynaklı olduğunu düşünebiliyorum .
Benim Wsdl bağlanma şeklim şu şekildedir.

Kod: Tümünü seç

butonclick(Sender:Tobject);
 var soap :ServiceSoap;
  sonuc:Objen//öyle diyelim:)
 begin
  soap := GetServiceSoap(false,nil,'');
  sonuc := soap.GetLicence()
 end;
 bu şekilde timeoutta düşmez.En azından bir kaç defa yaptırabilirsiniz.
Merhaba ,
GetServiceSoap metodunun içine baktığınızda siz 2nci parametreye NIL geçtiğiniz durumlarda kendi THTTPRIO nesnesini çalışma zamanında oluşturup kullanıyor özetle web servisi delphi nin hazır olarak sunduklarıyla consume etmek için mutlak bir şekilde THTTPRIO gerekli bence sorun başka bir şey.
Volkan KAMADAN
www.polisoft.com.tr
ertank
Kıdemli Üye
Mesajlar: 1657
Kayıt: 12 Eyl 2015 12:45

Re: WebService zaman aşımı

Mesaj gönderen ertank »

Merhaba,

GetLicense talep aldığı/çalıştığı zaman cevap vermesi uzun sürmüyor. Aslında saniye bile sürmüyor. Log dosyasından şöyle bir örnek vereyim.
2016-03-19 22:53:45.127 GetLicense çağırıldı.
2016-03-19 22:53:45.203 GetLicense cevap verdi.

ServiceSoap kullanımını anlamadım. WebService konularını yeni yeni uygulamaya çalışıyorum. URL, Service, Port bilgilerini doldurmadan çalışacak mı?

Daha önce belirttiğim gibi. Bu sorun sadece ilk çalıştırma talebi ile oluyor. Ardından ne kadar hızlı buton tıklayabilirsem o kadar hızlı cevap geliyor.
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: WebService zaman aşımı

Mesaj gönderen vkamadan »

Merhaba ,
servis interface inizin adı IDeneme diyelim , consume ettiğiniz uygulamada servis WSDL i ile oluşan UNIT içinde , geriye IDeneme interface ini dönen GEt ile başlayan bir fonksiyon olacak adına GetServisDeneme olsun , @gaus un önerdiği gibi denermisiniz.

Kod: Tümünü seç

var
 Servisiniz : IDeneme ;
begin
  Servisiniz := GetServisDeneme(False,nil,'');
  ShowMessage( Servisiniz.GetLicense(dt, CORRECT_CLIENT_IP, SYSTEM_UUID, OSUser, 'test') );
end;
Volkan KAMADAN
www.polisoft.com.tr
ertank
Kıdemli Üye
Mesajlar: 1657
Kayıt: 12 Eyl 2015 12:45

Re: WebService zaman aşımı

Mesaj gönderen ertank »

Merhaba,

Şu an için kendi yazmış olduğum kod ile de çalışıyor. Yani sorun her zaman çıkmıyor demiştim ya. Şu an sorun yok. Benim kendi kodum ile test edeceğim. Takılma olursa tavsiye edilen koda çevirip deneyeceğim.

IDeneme1.pas içinde aşağıdaki fonksiyon var:

Kod: Tümünü seç

function GetIDeneme(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): IDeneme;
Ben aşağıdaki gibi bir kod yazdım:

Kod: Tümünü seç

var
  s:string;
  Servis:IDeneme;
begin
      Servis        := GetIDeneme(False, EmptyStr, nil);
//      s             := Servis.GetLicense(dt, CORRECT_CLIENT_IP, SYSTEM_UUID, OSUser, 'test');
      s             := (HTTPRIO1 as IDeneme).GetLicense(dt, CORRECT_CLIENT_IP, SYSTEM_UUID, OSUser, 'test');
end;
Sorun ile karşılaştığım anda tavsiye edilen kodu açıp diğerini kapatacağım. Bakalım sorun tekrar kendini gösterecek mi...

Bir süre denedikten sonra buraya gelişmeler hakkında bilgi yazarım.

Teşekkürler.
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: WebService zaman aşımı

Mesaj gönderen vkamadan »

merhaba kendi kodunuzla deneyecekseniz bu kısmada gerek yok kapatabilirsiniz.

Kod: Tümünü seç

 Servis        := GetIDeneme(False, EmptyStr, nil);
 
Volkan KAMADAN
www.polisoft.com.tr
Cevapla