Delphi XE ve 10.3 SOAP

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
varyemez
Üye
Mesajlar: 256
Kayıt: 01 Oca 2009 11:00
Konum: Bursa
İletişim:

Delphi XE ve 10.3 SOAP

Mesaj gönderen varyemez »

Arkadaşlar, Delphi XE ile yazdığım bir E-Fatura prg var. Normal gönderiyor SendInvoice den. Fakat bir arkadaşın Dephi 10.3 kullanması gerekiyordu, aynı kodlar orda çalışmıyor. (entegrator izibiz) . Hiç başına gelen arkadaş var mı, nasıl çözdünüz?

mkysoft
Kıdemli Üye
Mesajlar: 3051
Kayıt: 26 Ağu 2003 12:35
Konum: İstanbul
İletişim:

Re: Delphi XE ve 10.3 SOAP

Mesaj gönderen mkysoft »

Muhtemelen servisi yeniden import etmeniz gerekir 10.3'de. Versiyonlar arası aynı değil malasef. Aynı kodu kullanmak isterseniz dll yapmak dışında bir seçenek bulamadım ben.

ertank
Üye
Mesajlar: 1323
Kayıt: 12 Eyl 2015 12:45

Re: Delphi XE ve 10.3 SOAP

Mesaj gönderen ertank »

varyemez yazdı:
18 Şub 2020 01:49
Arkadaşlar, Delphi XE ile yazdığım bir E-Fatura prg var. Normal gönderiyor SendInvoice den. Fakat bir arkadaşın Dephi 10.3 kullanması gerekiyordu, aynı kodlar orda çalışmıyor. (entegrator izibiz) . Hiç başına gelen arkadaş var mı, nasıl çözdünüz?
Kodlar orada çalışmıyor derken derler iken hata mesajı mı alıyorsunuz? Kodlar derleniyor ancak uygulama SOAP iletişimi kuramıyor mu?

varyemez
Üye
Mesajlar: 256
Kayıt: 01 Oca 2009 11:00
Konum: Bursa
İletişim:

Re: Delphi XE ve 10.3 SOAP

Mesaj gönderen varyemez »

Önce internal server error 500 geliyordu.. biraz oynadım kodlarla şimdi de invalid media type 415 geliyor. Birden fazla xml olduğu için onları base64binary e çevirdikten sonra Array_of_INVOICE a atıp gönderiyoruz. Ayrıca zip mi istiyor acaba diye düşünüp sıkıştırıp göndermeyi denedim yine olmadı. envelope içinde bir yerlere content-type tanımlamayı düşündüm ama oraya soapheader i nasıl koyacağımı bilemedim. XE diğer makinada duruyor , her iki envelope i da dışarı çıkarıp karşılaştıracağım bakalım neresi farklı.

varyemez
Üye
Mesajlar: 256
Kayıt: 01 Oca 2009 11:00
Konum: Bursa
İletişim:

Re: Delphi XE ve 10.3 SOAP

Mesaj gönderen varyemez »

mkysoft yazdı:
18 Şub 2020 03:59
Muhtemelen servisi yeniden import etmeniz gerekir 10.3'de. Versiyonlar arası aynı değil malasef. Aynı kodu kullanmak isterseniz dll yapmak dışında bir seçenek bulamadım ben.
Son çare dll olacak bu gidişle... bakalım o da çalışırsa..

ertank
Üye
Mesajlar: 1323
Kayıt: 12 Eyl 2015 12:45

Re: Delphi XE ve 10.3 SOAP

Mesaj gönderen ertank »

varyemez yazdı:
18 Şub 2020 08:28
Önce internal server error 500 geliyordu.. biraz oynadım kodlarla şimdi de invalid media type 415 geliyor. Birden fazla xml olduğu için onları base64binary e çevirdikten sonra Array_of_INVOICE a atıp gönderiyoruz. Ayrıca zip mi istiyor acaba diye düşünüp sıkıştırıp göndermeyi denedim yine olmadı. envelope içinde bir yerlere content-type tanımlamayı düşündüm ama oraya soapheader i nasıl koyacağımı bilemedim. XE diğer makinada duruyor , her iki envelope i da dışarı çıkarıp karşılaştıracağım bakalım neresi farklı.
Telerik Fiddler uygulamasını yükleyin.
İlk kurulumdan sonra Tools->Options->HTTPS içinden Capture HTTPS CONNECTs kutusunu işaretleyin ve bekleyin.
Bu noktada Fiddler kendi root sertifikasını işletim sistemi güvenilir sertifikaları içine yüklüyor. Gelen mesajlara onay verin. 3-4 tane kadar mesaj gelebilir ve hemen gelmezler.
Ayarların aktif olması için Fiddler uygulamasını kapatıp açın.

Bundan sonra uygulama HTTPS trafiğini yakalayabilir ve şifreli bilgiyi okunabilir hale çevirebilir.
Eski Delphi uygulamanızda proxy belirterek kullanabilirsiniz.
Delphi 10.3 için proxy tanımına gerek yok. Uygulama çalışmadan önce Fiddler çalışıyor ise otomatik kullanır.
Fiddler içinde inceleme yapmak için önce sol taraftan liste içinden ilgili iletişimi seçin. Ardından Inspectors kısmından istediğiniz bölümden giden ve gelen bilgileri görebilirsiniz. Şifreli bilgileri okunur hale getirmek için küçük bir panel gözükür. Tıkladığınızda okunur halini gösterir.
Ben Raw istek ve cevabı incelemenizi öneririm.

Eski Delphi ve Yeni Delphi, her iki uygulamadan giden SOAP requestlerini inceleyin. Mutlaka bir yerde unutulan birşey olmalı.

Delphi 10.3 ile izibiz entegrasyonu yapanlar var. DLL ile uğraşmanıza gerek yok.

Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3059
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Delphi XE ve 10.3 SOAP

Mesaj gönderen sabanakman »

Sanırım delphi'nin soap servis tasarımında ciddi bir problem var. Eğer tek olarak bu servis tanımlı ise projenizde muhtemelen servis çalışacaktır ama birden fazla servis adresi projede tanımlıysa "InvRegistry.Register....." ile xml yapıları objeler olarak kayda geçer ve xml, obje arası dönüşümlerini buna göre yapar. Kazara isim benzeri bir tanım geçerse ortalık toz duman olmakta ve kullandığınız sınıflar ve metotlar istediğiniz doğru xml leri üretemiyor. Bunu çözmenin yolu ise her servisi bağımsız dll olarak tasarlamaktan geçiyor. Gerçi yanlış hatırlamıyorsam geçmişte bu sorunun 10.3 veya 10.4 de çözüleceğini iddia eden birine denk gelmiştim ama 10.2 var elimde ve problem halen devam etmekte. Belki düzeltmeye çalıştılar ama bir şekilde berbat etmiş de olabilirler bilemiyorum ama dediğim gibi en büyük içerikli tek servisi projenizde tutun diğer tüm servisleri bağımsız dll projesi ile ayırmayı deneyin bir de.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .

ertank
Üye
Mesajlar: 1323
Kayıt: 12 Eyl 2015 12:45

Re: Delphi XE ve 10.3 SOAP

Mesaj gönderen ertank »

sabanakman yazdı:
19 Şub 2020 04:08
Sanırım delphi'nin soap servis tasarımında ciddi bir problem var. Eğer tek olarak bu servis tanımlı ise projenizde muhtemelen servis çalışacaktır ama birden fazla servis adresi projede tanımlıysa "InvRegistry.Register....." ile xml yapıları objeler olarak kayda geçer ve xml, obje arası dönüşümlerini buna göre yapar. Kazara isim benzeri bir tanım geçerse ortalık toz duman olmakta ve kullandığınız sınıflar ve metotlar istediğiniz doğru xml leri üretemiyor. Bunu çözmenin yolu ise her servisi bağımsız dll olarak tasarlamaktan geçiyor. Gerçi yanlış hatırlamıyorsam geçmişte bu sorunun 10.3 veya 10.4 de çözüleceğini iddia eden birine denk gelmiştim ama 10.2 var elimde ve problem halen devam etmekte. Belki düzeltmeye çalıştılar ama bir şekilde berbat etmiş de olabilirler bilemiyorum ama dediğim gibi en büyük içerikli tek servisi projenizde tutun diğer tüm servisleri bağımsız dll projesi ile ayırmayı deneyin bir de.
Daha önce de belirttiğim gibi bu servisler 10.3.3 ile sorunsuz kullanılmakta. İki farklı web servis URL kullanılmalı diye biliyorum ancak bahsettiğiniz çakışma yaşanmamakta. Muhtemelen aynı sınıf kullanımı yok ya da bahsettiğiniz sorun 10.3.3 ile çözülmüş durumda. Hangisi emin değilim.

varyemez
Üye
Mesajlar: 256
Kayıt: 01 Oca 2009 11:00
Konum: Bursa
İletişim:

Re: Delphi XE ve 10.3 SOAP

Mesaj gönderen varyemez »

dll yi XE de yazıp 10.3.3 de kullanmayı denedim, şimdi de Access violation hatası veriyor dll içinde. Ancak dll içini nasıl debug edeceğimizi bilemedim neresinde takılıyor görebilirmiyiz? dll de bir function tanımlayıp 5 tane string geçiriyorum , result ile yine bir string çıkarıyorum.
Ayrıca telerik Fiddler i kurup onunla da inceleyeceğim.

ertank
Üye
Mesajlar: 1323
Kayıt: 12 Eyl 2015 12:45

Re: Delphi XE ve 10.3 SOAP

Mesaj gönderen ertank »

Merhaba,

Eğer DLL kullanmakta ısrar ediyorsanız fonksiyonlarınızı WideString şeklinde tanımlamalısınız. DLL içindeki fonksiyonlarda string kullanımı çoğunlukla bir hatadır. WideString hafıza yönetimi işletim sistemi tarafından yönetilen BSTR türünde (https://docs.microsoft.com/en-us/previo ... tomat/bstr) bir değişkendir. Aksi halde hafıza kaçağı veya sizin başınıza geldiği gibi Access Violation hataları ile karşılaşmanız çok normaldir.

Eğer zaten fonksiyonlarınız WideString olarak tanımlanmış ise ve Access Violation hatası alıyorsanız bu çoğunlukla "Free" edilmiş bir sınıf kullanımı veya "Create" edilmemiş bir sınıf kullanımı sebebiyle oluşur. Bu anlamda DLL içindeki kodu incelemelisiniz. DLL projeniz içinden Log tutarak kodun en son hangi noktadan sonra hata verdiğini tespit etmeye çalışabilirsiniz.

Bunları belirttikten sonra yine tekrarlamak istiyorum. DLL kullanmanız gerekmiyor. Belirttiğiniz entegratör ile direk Delphi 10.3.3 üzerinden rahatlıkla entegrasyon sağlayabilirsiniz. Benim tavsiyem bu anlamda nerede sorun yaşadığınızı incelemeniz. Sorun yaşadığınız kod parçasını tespit ettikten sonra burada paylaşır iseniz yardımcı olunabilir.

varyemez
Üye
Mesajlar: 256
Kayıt: 01 Oca 2009 11:00
Konum: Bursa
İletişim:

Re: Delphi XE ve 10.3 SOAP

Mesaj gönderen varyemez »

telerik fiddleri kurdum. giden ve gelen dataya baktım. gelen data fiddlerda fault mesajı ve beklediğim mesaj. (aşagida yazacam) Ancak bu mesaj 10.3.3 de derlediğim exede 500 internal server error olarak geliyor. servisi try.. except içine almıştım E:Exception ile ve E.Message içinde XE derlemesinde yakalıyor. ama 10.3.3 derlemesinde internal server error geliyor.
Öte yandan wsdl import ederken de zaten ilk XE de oluşturduğum yapıyı 10.3 ile artık oluşturamıyorum.
sadece bu faultstring deki datayı yakalayabilsem o da yetecek. Sonuçta XML gidiyor karşıya ve işleniyor doğru veya yanlış, ama hata olduğunda sadece internal server error yazdığı için işimizi görmüyor.

Kod: Tümünü seç

<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<SOAP-ENV:Fault><faultcode>SOAP-ENV:Server</faultcode>
<faultstring>Fatura kontrolden geçemedi.Fatura gönderen ile session alan kullanıcı vergi kimlik veya tck kimlik numaraları aynı degildir56281177412</faultstring><detail><RequestFault xmlns="http://schemas.i2i.com/ei/wsdl"><INTL_TXN_ID xmlns="">1332732980</INTL_TXN_ID><CLIENT_TXN_ID xmlns=""/><ERROR_CODE xmlns="">2005</ERROR_CODE><ERROR_SHORT_DES xmlns="">Fatura kontrolden geçemedi.Fatura gönderen ile session alan kullanıcı vergi kimlik veya tck kimlik numaraları aynı degildir56281177412</ERROR_SHORT_DES><ERROR_LONG_DES xmlns="">Fatura kontrolden geçemedi.Fatura gönderen ile session alan kullanıcı vergi kimlik veya tck kimlik numaraları aynı degildir56281177412</ERROR_LONG_DES></RequestFault></detail></SOAP-ENV:Fault></SOAP-ENV:Body></SOAP-ENV:Envelope>

ertank
Üye
Mesajlar: 1323
Kayıt: 12 Eyl 2015 12:45

Re: Delphi XE ve 10.3 SOAP

Mesaj gönderen ertank »

Bu bahsettiğiniz sorun bilinen ve rapor edilmiş bir Delphi 10.3.3 hatası. 10.4 sürümde düzeltilmesi bekleniyor.
Detaylı bilgi için: https://quality.embarcadero.com/browse/RSP-27194

Şu an için aşağıdaki gibi bir çözüm uygulayabilirsiniz:

Kod: Tümünü seç

interface

uses
  Soap.SOAPHTTPTrans, // 10.3.3 error workaround
  System.Net.HttpClient;

type
  TMyType = class
    class procedure DoSOAPHttpError(const HTTPReqResp: THTTPReqResp; const HTTPResponse: IHTTPResponse; const Error: ESOAPHTTPException; var Action: TSOAPHttpErrorAction);
  end;

implementation

{ TMyType }
class procedure TMyType.DoSOAPHttpError(const HTTPReqResp: THTTPReqResp; const HTTPResponse: IHTTPResponse; const Error: ESOAPHTTPException; var Action: TSOAPHttpErrorAction);
begin
  if HTTPResponse.StatusCode = 500 then
    Action := heaSuccess;
end;

{************************
  Bu kısımda normal kodunuzu kullanıyor olacaksınız.
************************}


initialization
  // 10.3.3 error workaround
  Soap.SOAPHTTPTrans.SetOnHttpError(TMyType.DoSOAPHttpError);

varyemez
Üye
Mesajlar: 256
Kayıt: 01 Oca 2009 11:00
Konum: Bursa
İletişim:

Re: Delphi XE ve 10.3 SOAP

Mesaj gönderen varyemez »

Evet, çok teşekkürler. debug yaparken aşağıdaki gibi mesaj çıkıyor ama E.message de yerli yerinde geliyor programda.

---------------------------
Debugger Exception Notification
---------------------------
Project eFatura.exe raised exception class RequestFault with message 'Fatura kontrolden geçemedi.Fatura gönderen ile session alan kullanıcı vergi kimlik veya tck kimlik numaraları aynı degildir56281***xxx'.
---------------------------
Break Continue Help
---------------------------
Bakalım success olan gönderimlerde '0' RETURN_CODE nasıl yakalayacam. şimdilik 500 e karşı önlem aldık değil mi..

Cevapla