Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 5/5 - 2 oy
  • 1
  • 2
  • 3
  • 4
  • 5
WSDL import
#1
Merhaba,

c# tarafında çalışan webServisin wsdl'ini delphi ortamına entegre ediyorum ancak web servis bir türlü düzgün çalışmıyor. Wsdl dosyasını import ettiğimde bir çok fazla sınıf oluşturuyor.
iç içe sınıflar oluşuyor. Wsdl import ayarlarını değiştiriyorum ancak bir işe yaramıyor. 

 gidenBelgeDurumSorgulaResponse2 = class;      { "http://service.connector.uut.cs.com.tr/"[GblCplx] }
 gelenBelgeleriAlExt3 = class;                 { "http://service.connector.uut.cs.com.tr/"[GblCplx] }
 yereleAktarilacakBelgeleriAlExt2 = class;     { "http://service.connector.uut.cs.com.tr/"[GblCplx] }
 belgeGonderExt2      = class;                 { "http://service.connector.uut.cs.com.tr/"[GblCplx] }
 gidenIrsaliyeleriArsiveKaldirResponse2 = class;   { "http://service.connector.uut.cs.com.tr/"[GblCplx] }
 belgelerAlindiResponse2 = class;              { "http://service.connector.uut.cs.com.tr/"[GblCplx] }
 gelenBelgeDurumSorgulaExtResponse2 = class;   { "http://service.connector.uut.cs.com.tr/"[GblCplx] }
 gelenBelgeDurumSorgulaExt2 = class;           { "http://service.connector.uut.cs.com.tr/"[GblCplx] }
 serviceReturnType    = class;                 { "http://service.connector.uut.cs.com.tr/"[GblCplx] }
 gelenBelgeEkleriAlResponse2 = class;          { "http://service.connector.uut.cs.com.tr/"[GblCplx] }
 kayitliKullaniciListeleExtendedTimeResponse2 = class;   { "http://service.connector.uut.cs.com.tr/"[GblCplx] }

Sorun
gelenBelgeleriAlExt sınıfı gibi diğer sınıflarıda çoğaltıyor.
gelenBelgeleriAlExt1
gelenBelgeleriAlExt2
gelenBelgeleriAlExt3 oluşuyor bunun önüne geçme şansımız var mı?..

ve Ayrıca
ve EFatura/arşiv uygulamaları için delphi ile düzgün çalışabileceğimiz bir entegratör bilen var mı?
(FIT(Foriba),  Bimsa, Logo Entegratöleri denenmiştir istenilen sonuç alınamamıştır).

Şimdiden teşekkürler.
Cevapla
#2
Bu sorunu yaşadığın webServisin wsdl inide paylaşmanda sakınca yoksa bir bakalım
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla
#3
Web Servisi yazanların bir seçenek var şuanda hatırlamıyorum onu seçerek delphiyi desteklemesi gerekiyor aksi taktirde çalışmıyor bu tarz konularla karşılaştığımzda c# ile dll yazıp delphide bu dll'i kullanıyoruz
Cevapla
#4
Hocam wsdl icin Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol buradan import edebilirsiniz..

Delphium hocam o seçenek nedir entegrator e söylesek te bize o şekilde verseler wsdl i
Cevapla
#5
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol arkadaşlarla iletişime geçirebilirim isterseniz..
Bilgi paylaştıkça çoğalır..
WWW
Cevapla
#6
Web servis C# ile import edildiğinde, örneğin gidenBelgeDurumSorgula methodu aşağıdaki şekilde;
gidenBelgeDurum gidenBelgeDurumSorgula(string vergiTcKimlikNo, string belgeOid)

Delphi'de tanımı aşağıdaki şekilde;
function  gidenBelgeDurumSorgula(const parameters: gidenBelgeDurumSorgula): gidenBelgeDurumSorgulaResponse; stdcall;


methodu string parametreli hale çevirince servisten, cevap dönüyor. (Her ne kadar yöntem, mantık dışı olsa da Smile )

function  gidenBelgeDurumSorgula(const vergiTcKimlikNo: string; const belgeOid:string): gidenBelgeDurumSorgulaResponse; stdcall;

 
"Bu işlem için oturum açılmış olmalı.Oturumunuzun süresi dolmuş olabilir.Yeniden oturum açmayı deneyin."

using ConsoleApp1.ServiceReference1;

class Program
{
   static void Main(string[] args)
   {
       ConnectorServiceClient client = new ConnectorServiceClient();
       gidenBelgeDurum response = client.gidenBelgeDurumSorgula("11111111111", "BEC0EC59-2154-4C44-9601-6725A3F63DD2");
   }
}


    function  gidenBelgeDurumSorgula(const parameters: gidenBelgeDurumSorgula): gidenBelgeDurumSorgulaResponse; stdcall; overload;

    function  gidenBelgeDurumSorgula(const vergiTcKimlikNo: string; const belgeOid:string): gidenBelgeDurumSorgulaResponse; stdcall;  overload;


var
 Request: gidenBelgeDurumSorgula;
 Response: gidenBelgeDurumSorgulaResponse;
begin
 Request := gidenBelgeDurumSorgula.Create;
 Request.vergiTcKimlikNo := '11111111111';
 Request.belgeOid := 'BEC0EC59-2154-4C44-9601-6725A3F63DD2';
 try
   // Response := GetConnector(true, '', nil).gidenBelgeDurumSorgula(Request);
   Response := GetConnector(true, '', nil).gidenBelgeDurumSorgula(Request.vergiTcKimlikNo,Request.belgeOid);
 except on E: Exception do
   ShowMessage(E.Message);
 end;  
My name is nobody.
WWW
Cevapla
#7
ismailkocacan hocam
sizin dediğiniz gibi değişimler yaptım ancak bir ara şöyle bir problemle karşılaştım
Soap Response den dönen cevap Örneğin : True iken
benim değişkenime dönen cevap False olabiliyor.
ama dediğinizi tekrar bir deneyeceğim. bir değişiklik olursa bildiririm.
  Hocam birde GetConnector metodu geldi mi sizde yoksa siz mi yazdınız. Ben import ettiğimde gelmiyor da


Delphi oturum açmayı destemiyor sanırım (HTTPRIO ile Cookie arasında bir bağlantı bulamadık). Bu wsdl in bir userService olanı var onda login olup bize bir cookie dönüyor.
ancak bunun delphi tarafında sağlayamıyoruz. Bu yüzde SOAP Header' a ekliyoruz kullanıcı bilgilerini.
Örnek c# kodu:
  kullanici_giris.userService login = new kullanici_giris.userService();
  webservice_methods.connectorService methods = new webservice_methods.connectorService();

   login.CookieContainer = new System.Net.CookieContainer();
   methods.CookieContainer = login.CookieContainer;
   login.wsLogin(USERNAME, PASSWORD, "tr");

mcuyan Hocam bu arkadaş entegratör mü? yoksa oda delphi üzerinde bir entegratörle yazılım mı geliştiriyor tam anlayamadım.

Çözüm olarak
Belki uğraşan arkadaşlara bir yardımı olur ben yaptıklarımı paylaşıyım. Çok uğraştırdı bizi ancak en sağlıklı çözüm sanırım bu şekilde.
RIO companentini sadece iletişim için kullanıyorum. 
   -Gönderilen soap mesajını BeforeExecute olayında kendi düzenlediğimi yolluyorum. 
   -Gelen soap mesajını AfterExecute olayında xml'e aktarıyorum oradan gerekli olanları xml içinden alıyorum.

Örneğin eFaturaKullanıcıSorgula diye bir metod varsa VKN verilip Efatura kullanıcısı mı değilmi sonucu dönüyorsa

procedure HeaderEkle
 Istek := TStringList.Create;
 Istek.Clear;
 Istek.Add('<?xml version="1.0" encoding="utf-8" ?>');
 Istek.Add('<soapenv:Envelope');
 Istek.Add('  xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" ');
 Istek.Add('  xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" ');
 Istek.Add('  xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" ');
 Istek.Add('  xmlns:ser="http://service.connector.uut.cs.com.tr/"> ');

 Istek.Add('<soapenv:Header>');
 Istek.Add('  <wsse:Security>');
 Istek.Add(' <wsse:UsernameToken>');
 Istek.Add('   <wsse:Username>'+AktifKullanici.EntegratorKullaniciAdi+'</wsse:Username>');
 Istek.Add('           <wsseTongueassword>'+AktifKullanici.EntegratorParola+'</wsseTongueassword>');
 Istek.Add(' </wsse:UsernameToken>');
 Istek.Add(' </wsse:Security>');
 Istek.Add('</soapenv:Header>');

BODY Olusturdugum kısım
  HeaderEkle;
 Istek.Add('   <soapenv:Body>');
 Istek.Add('      <ser:efaturaKullanicisi>');
 Istek.Add('         <vergiTcKimlikNo>'+aVKN+'</vergiTcKimlikNo>');
 Istek.Add('      </ser:efaturaKullanicisi>');
 Istek.Add('   </soapenv:Body>');
 Istek.Add('</soapenv:Envelope>');
bunu RIO nun beforunda gönderiyorum.

gelen cevabımıda şu şekilde alıyorum. Xml e aktarıp afterda
  if Assigned(Cevap) then
   begin
     Result := StrToBool(Trim(Cevap.selectSingleNode(Trim('/S:Envelope/S:Body/ns2:efaturaKullanicisiResponse/return')).Text));
   end;

Yardımlarınız için canı gönülden teşekkür ediyorum.

Ek bilgi : Kendi örneklerinde de almaya çalışmışlar ancak yazan arkadaş en son başa çıkamayınca bizim yaptığımız gibi yollayıp, almış
Cevapla
#8
GetConnector methodunu ben yazdım.Fakat fazladan bir şey yapmadım.Delphi'nin standart wsdl import sonrası gelen methodu interface'e göre düzenledim.
Tabi bahsettiğiniz serviste GetConnector methodunu  delphi oluşturamadı.
Her iki yöntem de doğru bir geliştirme yöntemi değil, sınıfları xml serialize/deserialize edilirken doğru bir şekilde yapılması gerekir.
My name is nobody.
WWW
Cevapla
#9
GetConnector methodu
function GetConnector(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO) : ConnectorService;
const
 defWSDL = 'https://erpefaturatest.cs.com.tr:8443/efatura/ws/connectorService?wsdl';
 defURL = 'https://erpefaturatest.cs.com.tr:8443/efatura/ws/connectorService';
 defSvc = 'connectorService';
 defPrt = 'ConnectorServicePort';
var
 RIO: THTTPRIO;
begin
 Result := nil;
 if (Addr = '') then
 begin
   if UseWSDL then
     Addr := defWSDL
   else
     Addr := defURL;
 end;
 if HTTPRIO = nil then
   RIO := THTTPRIO.Create(nil)
 else
   RIO := HTTPRIO;
 try
   Result := (RIO as ConnectorService);
   if UseWSDL then
   begin
     RIO.WSDLLocation := Addr;
     RIO.Service := defSvc;
     RIO.Port := defPrt;
   end
   else
     RIO.URL := Addr;
 finally
   if (Result = nil) and (HTTPRIO = nil) then
     RIO.Free;
 end;
end;
My name is nobody.
WWW
Cevapla
#10
Anladım hocam.
Benim dediğim mesela EFaturaKullanicisi mi metodunun giriş parametrelerini çalıştırdım ancak true gelmesi gereken yerde false değer geldi.
ancak
RIO componentinin BEFORE ve AFTER olaylarında gelen giden mesajları yakalayıp , çözümlemek daha sağlıklı geldi.

Tekrar teşekkürler. Yardımlarınız için
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  WSDL Import Tanımlaması hakkında adelphiforumz 10 385 26-01-2018, Saat: 12:01
Son Yorum: Fesih ARSLAN
  Wsdl Xml Importer(Çözüldü) yhackup 17 385 09-01-2018, Saat: 15:42
Son Yorum: yhackup
  Excelden den import sırasında mükerrer kaydı konrol edip farklı işlem yapma musdi42 1 206 14-11-2017, Saat: 12:21
Son Yorum: uparlayan
  PTT wsdl yhackup 4 580 11-09-2017, Saat: 15:51
Son Yorum: yhackup
  Servis (wsdl) dönen değeri işleme esistem 17 1.158 22-08-2017, Saat: 09:57
Son Yorum: ismailkocacan



Konuyu Okuyanlar: 1 Ziyaretçi