SOAP Web Servis Yaşam Döngüsü
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
SOAP Web Servis Yaşam Döngüsü
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.
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
www.polisoft.com.tr
Re: SOAP Web Servis Yaşam Döngüsü
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.
- 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.
Re: SOAP Web Servis Yaşam Döngüsü
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..
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
www.polisoft.com.tr
- 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ü
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 amagibi 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.
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);
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. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
Re: SOAP Web Servis Yaşam Döngüsü
@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.
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
www.polisoft.com.tr
Re: SOAP Web Servis Yaşam Döngüsü
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?.
Re: SOAP Web Servis Yaşam Döngüsü
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.
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
www.polisoft.com.tr
Re: SOAP Web Servis Yaşam Döngüsü
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.
Re: SOAP Web Servis Yaşam Döngüsü
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
www.polisoft.com.tr
Re: SOAP Web Servis Yaşam Döngüsü
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.
- 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.
Re: SOAP Web Servis Yaşam Döngüsü
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.
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.
Re: SOAP Web Servis Yaşam Döngüsü
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.
Re: SOAP Web Servis Yaşam Döngüsü
@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.
Re: SOAP Web Servis Yaşam Döngüsü
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.
gelen isteklerde şöyle
Biyerde hatamı yapıyorum yoksa soap mantığınamı aykırı anlamadım.
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';
......
......
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;
Re: SOAP Web Servis Yaşam Döngüsü
Bu arada gelen hata acces violation hatası.