Delphi XE ve 10.3 SOAP
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Delphi XE ve 10.3 SOAP
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?
Re: Delphi XE ve 10.3 SOAP
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.
Re: Delphi XE ve 10.3 SOAP
Kodlar orada çalışmıyor derken derler iken hata mesajı mı alıyorsunuz? Kodlar derleniyor ancak uygulama SOAP iletişimi kuramıyor mu?
Re: Delphi XE ve 10.3 SOAP
Ö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ı.
Re: Delphi XE ve 10.3 SOAP
Telerik Fiddler uygulamasını yükleyin.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ı.
İ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.
- sabanakman
- Kıdemli Üye
- Mesajlar: 3077
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
Re: Delphi XE ve 10.3 SOAP
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. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
Re: Delphi XE ve 10.3 SOAP
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.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.
Re: Delphi XE ve 10.3 SOAP
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.
Ayrıca telerik Fiddler i kurup onunla da inceleyeceğim.
Re: Delphi XE ve 10.3 SOAP
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.
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.
Re: Delphi XE ve 10.3 SOAP
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.
Ö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>
Re: Delphi XE ve 10.3 SOAP
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:
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);
Re: Delphi XE ve 10.3 SOAP
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..
---------------------------
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..