SOAP Web Servis Yaşam Döngüsü

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

SOAP Web Servis Yaşam Döngüsü

Mesaj gönderen vkamadan »

Merhaba değerli üyeler ,

Windows Hizmeti olarak tasarladığımız bir SOAP Web Servis Sunucu uygulamamız var ,
bir istek geldiğinde ilgili metod çalışıyor ve geriye cevabı veriyor, o an yaratılan kanal cevabı verdikten sonra ömrünü tamamlıyor şöyle bir şeye ihtiyacım var,

web servis metodlarımdan biri bir web sitesinden postback yöntemiyle bilgi çekip geri veriyor, ilgili sitede captcha güvenlik doğrulaması mevcut, mevcut yapımla mümkün olmadığını biliyorum ama ;

SorguHazirla adında bir metdodumla önce siteye oturum açıp güvenlik resimi alsam kullanıcıya geri versem sonra kullanıcı asılmetoda güvenlik resminde gördüğü kodu da ekleyerek yola devam etse, şimdi ilk metod güvenlik resmini almak için bağlandığında açtığı session sona erdiği için sonrasında o kodun bir hükmü kalmıyor sorunumu anlatabilmişimdir inşallah, bu yapıyı uygulamak mümkünmüdür yoksa bir fantezimidir.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: SOAP Web Servis Yaşam Döngüsü

Mesaj gönderen mrmarman »

Merhaba...

- Bence basit bir veritabanı tablosu ile halledebilirsiniz.

1. Bu sizin session cache tablosudu diyelim. Client WSDL için erişim yaparken bir ID ile gelir, o ID'yi ve sistem tarafından uygun gördülen captcha kodunu bu yapılandıracağınız cache tabloda kayıt altına alırsınız.

2. Kullanıcı ikinci defa cevap için erişim yaptığında aynı ID ile eşleştirip cevabı karşılaştırısınız.

3. Karşılaştırma doğru sonuç verse de yanlış sonuç verse de, o ID'li kaydı silersiniz ve ikinci bir şans vermezsiniz.

4. Sonuç doğrultusunda dönüş yaparsınız.
Resim
Resim ....Resim
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: SOAP Web Servis Yaşam Döngüsü

Mesaj gönderen vkamadan »

Merhaba @mrmarman ,
cevabınız için teşekkürler ,

Önerdiğiniz yapı teorikte düşündüğümüz yapı, sorun şurda çıkıyor , kullanıcı web servis e captcha yı almak için geldiğinde biz ilgili siteye oturum açıp capctha aşamasına kadar geliyoruz alıp geri veriyoruz o noktadan sonra bizim web servis kanalı görevini tamamladığı için yok ediliyor dolayısıyla captchanın alındığı siteyle olan oturumda sona eriyor capctcha geçerliliğini kaybediyor.. oturumu yitirmeden bu işi yapabilirmiyiz acaba..
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3077
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: SOAP Web Servis Yaşam Döngüsü

Mesaj gönderen sabanakman »

Bununla ilgili 3 değişik öneri sunulabilir.

1-Aslında meseleyi derinlemesine pek incelemedim o yüzden bilgilerim biraz yüzeysel kalabilir. Delphi tarafından arayüz sihirbazı kullanarak yeni bir SOAP hizmeti uygulaması oluştururken servis ismi ve unit isminin sorulduğu ekranda bir de Service activation model seçeneği var sayılan olarak Per Request gelmektedir. Bu da her istek için sunucuda ayrı bir sınıf ile cevap vermeye yaramaktadır. Bu değer Global yapılırsa bellekte oluşan bir sınıf üzerinden cevap vermektedir. İşte bu noktada var olan metoda bazı uyarlamalar yapılabilir mi bilemem. En azından untTestImpl.pas altında bulunan InvRegistry.RegisterInvokableClass(TTest); gibi bir kod tüm isteklere ayrı sınıf oluşturmakta ama

Kod: Tümünü seç

procedure TestFactory(out obj: TObject);
{$J+}
const
  iInstance: ITest = nil;
  instance: TTest = nil;
begin
  if instance = nil then
  begin
    instance := TTest.Create;
    instance.GetInterface(ITest, iInstance)
  end;
  obj := instance
end;

initialization
   InvRegistry.RegisterInvokableClass(TTest, TestFactory);
gibi bir kod ise var olan bir sınıfla cevap vermektedir. Bu kısımda nasıl bir yönetim olur bilemem, belki bu yöntemle mümkün bile olmayabilir. Ama SOAP yapısı bu şekilde çalışmaktadır.

2- Her ne kadar InvRegistry.RegisterInvokableClass(TTest); ile farklı oturumlar oluşsa bile bu sınıflardan bağımsız bir TDataModule gibi bir sınıf kullanılabilir. Oturuma bağlı işleriniz bu DataModule içinde uygulanır. Her bağlanacak kişi için bir ID oluşturulabilir ve her ID için bağımsız DataModule oluşturulabilir. Kısacası ID ile ilgili DataModule varsa bulunur yoksa eklenirse her ne kadar istemci için oluşan SOAP oturumları bağımsız olsa bile ID numaraları sayesinde oturum yönetimi taklit edilebilir belki. Burada da yönetim ve organizede bazı zorluklar çıkabilir ama. Mesela kullanıcı uzun süre bağlantıyı kullanmazsa o ID ye ait oturumun kullandığı bağlantı zaman aşımından kapanabilir. Ayrıca bu ID lere bağlı oluşan DataModule nesnelerini (artık kullanılmadığı için) doğru zamanda yok etmek veya yeni bir oturum açacak kişiye tahsisi gerekebilir. En azından kullanılmayan ID yi tespit edebilmek bu noktada anahtar problem olacaktır.

3-SOAP'tan vaz geçerek DataSnap ile bu işleri otomatik olarak oturuma bağlı hale getirebilirsiniz.
En son sabanakman tarafından 08 Kas 2013 11:09 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: SOAP Web Servis Yaşam Döngüsü

Mesaj gönderen vkamadan »

@sabanakman ,

zaman ayırdığınız için teşekkürler,
bizde tamda sizin 2 numaralı önerinize benzer bir yapı üstünde çalışmaya başlamıştık ve başarılı olduk ,

Her istekte bağımsız bir form yaratıyor sistem, oluşan formu object list içinde bir GUID ile ekliyoruz, sonrasında geriye imaj ve GUID i dönüyoruz, sonraki metod hernekadar ayrı bir kanaldan gelsede GUID ile arkada bekleyen objectlist içinde ilgili formu bulup yola devam edip sonrada yok ediyoruz, fakat askıda kalımlar olabiliyor yönetimi için birşeyler düşüneceğiz.

Teşekkürler.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
tuna
Üye
Mesajlar: 300
Kayıt: 07 Tem 2008 04:39
Konum: İstanbul

Re: SOAP Web Servis Yaşam Döngüsü

Mesaj gönderen tuna »

Merhaba konuyu hortlatmış gübü olucam ama sanırım benim sorunumla aynı. Bende ilk oturumda hafızaya bir nesne create edip sonraki bağlanan her kullanıcı için bu nesneyi kullanmak istiyorum ama oturum kapanınca nesne kapanıyor ve diğer kullanıcılarda tekrar bağlanıyor. Siz nasıl çözdünüz?.
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: SOAP Web Servis Yaşam Döngüsü

Mesaj gönderen vkamadan »

Merhaba
Sunucu uygulamamız windows hizmet uygulamasıydı , bunu masa üstü stand alone server uygulamasına çevirdik, ve her gelen servis isteğinde boşlukta bir VCL form oluşturduk bir GUID ile işaretleyip global listede ilgili GUID ve o oturum için oluşturduğu formun adresini tutan bir listeden yararlandık, burada iyi yönetilmesi gereken konu oturumun sona erdiğini anlamak, bunun için zaman aşımı ve oturumun sona erdiği bilgisini client in vermesini sağlayan yardımcı metodlar kullandık aksi durumda hükümsüz formlar (oturumlar) çöplüğe neden olup hafıza sorunları yaratıyor.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
tuna
Üye
Mesajlar: 300
Kayıt: 07 Tem 2008 04:39
Konum: İstanbul

Re: SOAP Web Servis Yaşam Döngüsü

Mesaj gönderen tuna »

Cevabınız için çok teşekkür ederim. Bende aynı şekilde standalone olarak server tarafını yazıyorum. Sizden farklı olarak hafızaya yarattığım objeye tüm oturumların erişmesini istiyorum. Yani bir kere yaratılacak tüm oturumlar onu kullanacak gibi. Bu konuda bir öneriniz varmıdır.
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: SOAP Web Servis Yaşam Döngüsü

Mesaj gönderen vkamadan »

Merhaba bu konuda sorun yaşamanız çok muhtemel , çünkü gelen her oturum ayrı bir Thread olacağı ve VCL de Thread-SAfe olmadığı için büyük olasılıkla erişim ihlali sorunları yaşayacaksınız (aynı anda gelen istekler farklı Thread lerden aynı forma erişmek isteyecek vb..) Thread güvenli uygulamaların incelikleri konusunda size öneri verebilecek kadar bilgi ve tecrübe sahibi değilim, belki riskler minimuma indirilerek bir çözüm üretilebilir.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: SOAP Web Servis Yaşam Döngüsü

Mesaj gönderen mrmarman »

Başlığın bütünlüğünü bozmamak için bir defa yazacak ve bir daha karışmayacağım.

- Aynı forma erişmesi ihtiyacınızı biraz açsanız belki diğer yakadan çözüm önerebilirdik.

- Sizin problem ettiğiniz husus bir erişim ile oluşan threadde oluşan DATASET'in kendisini parametre veya result olarak sunmak istediğiniz, ikinci bir threadde de daha önce free edilmiş olan buna yeniden erişmek istemenizle ilgili olduğu yönünde fikir oluştu.

- Buna zaten gerek yok demiştik. ClientDataSet bunun için var. Bir önceki erişen kişinin irtibatı ile bir sonraki diğer erişim yapacak olan kişiler arasındaki ilişkiyi ifade ederseniz sorunuz daha da netleşecektir.
Resim
Resim ....Resim
Kullanıcı avatarı
tuna
Üye
Mesajlar: 300
Kayıt: 07 Tem 2008 04:39
Konum: İstanbul

Re: SOAP Web Servis Yaşam Döngüsü

Mesaj gönderen tuna »

mrmarman hocam merhaba. Şimdi konuyu şöyle anlatmaya çalışıyım. Web soap server uygulamam üzerinde Adoqery nesnem olduğunu düşünün.
Bu nesneyi ben ilk web server'i start ettiğimde create edip login olup bekletiyorum. Yada ilk çalğrı geldiğinde create edip login olup bekliyorum.
Sonra bir çağrı daha geliyor eğer bu nesne hafızada varmı diye bakıyorum varsa login olma önceki nesneden devam et şeklinde kullanmak istiyorum ama ne yaptıysam başaramadım. Oluşan nesneye diğer oturumlar erişemiyor.
Kullanıcı avatarı
tuna
Üye
Mesajlar: 300
Kayıt: 07 Tem 2008 04:39
Konum: İstanbul

Re: SOAP Web Servis Yaşam Döngüsü

Mesaj gönderen tuna »

Not bu arada kullandığım nesne adoquery değil örnek olsun diye verdim. Aslında benim create edip login olarak bekletmek istediğim şey Logo Tiger programının lobjects (unityapplication) nesnesi.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: SOAP Web Servis Yaşam Döngüsü

Mesaj gönderen mrmarman »

@mrmarman yazdı:Zaten yazdığımın aynısını yazmışsınız, önceki nesneden devam etme mecburiyetinin nedenini sormuştum. Gerek yok normalde. Özel bir sebebi mi var ?

sorusunu yazarken cevabı geldi :)

Araya bir arayüz yazıp herkese onu kullandırmaya çalışıyorsunuz anladım. Bunu yapmak için illaki de Server'deki DataSet'i client'e taşımak zorunda değilsiniz.

- Bunu bir CLASS ile çözmeyi deneyebilirsiniz.
- tTigerHelper = Class(TObject) oluşturarak işe başlayın.
- Nesnenizi if xTiger = nil then xTiger := tTigerHelper.Create; şeklinde ilk erişim ile tetiklenecek şekilde create edilecek, aynı zamanda xTiger ortak paydasında erişilebilecek global bir yere koyun.
- Erişim threadiniz için bir başvuru kaynağı olacaktır.
- CLASS içerisinde hazırlamış olacağınız function, procedure, property'ler üzerinden sorarsınız, xTiger size gereken cevabı sunacaktır. Siz de aktif thread üzerinden cevabı client'e iletmiş olursunuz.
Resim
Resim ....Resim
Kullanıcı avatarı
tuna
Üye
Mesajlar: 300
Kayıt: 07 Tem 2008 04:39
Konum: İstanbul

Re: SOAP Web Servis Yaşam Döngüsü

Mesaj gönderen tuna »

mrmarman hocam cevaplarınız için çok teşekkür ederim. Ama yine istediğim olmuyor.
Aşağıda kodlarımı ekliyorum inşallah yardımcı olabilirsiniz.
Sorunum ilk server çalıştığında unit1 i create ediyorum sonrasında istek geldiğinde buna yönlendiriyorum.
Ama unit1 içindeki logo nesnesini gelen çalğrılar görmüyor.

Önce tiger objesi için soap projesine bir unit ekledim ve içine class oluşturdum.

Kod: Tümünü seç

unit Unit1;

interface

uses System.SysUtils,System.Classes,System.Variants,UnityObjects_TLB;

type
TTigerHelper=class(TObject)

public
Logo:TUnityApplication;

Constructor Create;

published

function firmadondur(firma:string):string;

private

end;

implementation
{ TTigerHelper }

constructor TTigerHelper.Create;  //[b]ilk nesne create olurken tiger üzerinde oturum açması için[/b]
begin
logo:=TUnityApplication.Create(nil);
logo.Login('kullanıcıadı','şifre');
end;

function TTigerHelper.firmadondur(firma: string): string; //deneme fonksiyonum
var
 order : OleVariant;
 transactions: OleVariant;
 i : Byte;
 begin
 order := logo.NewDataObject(3); //[b]hata burada geliyor. Dışardan istek geldiğinde logo nesnesini görmüyor.[/b]
order.New;
order.DataFields.FieldByName('NUMBER').Value :='000050';
......
......
gelen isteklerde şöyle

Kod: Tümünü seç

function TObjeTestServisi.kartdene(test: string): string;
var
deneme:TTigerHelper;
begin
   if TTigerHelper=nil then
    begin
    deneme:=TTigerHelper.Create();
    end
    else
    begin
      result:=deneme.firmadondur('1');
    end;
end;
Biyerde hatamı yapıyorum yoksa soap mantığınamı aykırı anlamadım.
Kullanıcı avatarı
tuna
Üye
Mesajlar: 300
Kayıt: 07 Tem 2008 04:39
Konum: İstanbul

Re: SOAP Web Servis Yaşam Döngüsü

Mesaj gönderen tuna »

Bu arada gelen hata acces violation hatası.
Cevapla