Tüm Platformlar için Hızlı Uygulama Geliştirme Kitap Yayın Süreci
Kitap gözden geçirilmek üzere BTG (Bilgi ve Teknoloji Grubu) 'na gönderildi. 05.10.2018-14:10
BTG (Bilgi ve Teknoloji Grubu) tarafından iki sayfalık bir reklam tasarımı bekleniyor. 08.10.2018 - 15:30
Kitap basım talebi değerlendirilmek üzere matbaaya bildirildi. Matbaadan basım süreci hakkında bilgi bekleniyor. 15.10.2018 - 15:34

Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 5/5 - 3 oy
  • 1
  • 2
  • 3
  • 4
  • 5
WSDL HelperClass [ Web Service WSDL, hem de suya SOAP'a dokunmadan :) ]
#1
Herkese merhaba.

WSDL web service olayına aşina olmak isteyip de ürken arkadaşlar için basit bir yaklaşım tasarladım. 

At   Web Service konusu bilindiği üzere, bilgisayarınızı bir WEB sunucusu haline getiren, üçüncü parti herhangi bir yazılım/donanım altyapısı ihtiyacı olmayan oldukça faydalı bir yapıdır.

Idea   Mevcut projenizde de dahil edilmesi basittir. Hali hazırdaki VCL Form Application durumunda herhangi bir modifikasyona ihtiyaç duyulmaz. Sadece UNIT eklenir ve Web Servis / Server anında hazır.

Kullanım alanı oldukça geniştir. Kullanım alanı örnekleri derken
  • Mobil Cihazınızdan Desktop Win32 uygulamanıza anlık GPS bilgisi gönderir alır mesela lojistik veya öğrenci servisi takibi yapabilir,
  • Stok kontrol işlemlerinizde basit bir WiFi ağı ile ürün sorgulayabilir cevabını online ana veritabanından alabilir,
  • Mesajlaşma (Chat) kanalı kurar server destekli basit bir mesajlaşma ara birimi oluşturabilir,
  • Projelerinizi WEB üzerinden birbiri ile konuşturarak uzak şehirler arasında hızlı veritabanı / bilgi paylaşımı yapabilir,
  • Projelerinizin hali hazırda WEB ile olan irtibatını daha da zenginleştirebilirsiniz.
Bu altyapıyı Delphi XE ile kurdum. Delphi 2007 için benzer bir örneğim var ve daha önce forumlarda paylaşmıştım ancak sınıf haline getirmek biraz daha zahmet istiyor. Bu da sizlere anlaşılır kod yazma verimini düşürüyor.

Ana projemizde değerli vaktimizi akıllı bir sistem kurmaya ayırmış oluyoruz. WEB üzerinden gelen çağrı / veri vs. ne olursa ana projemize alarak aynı anda değerlendirdiğimiz sonucu yine sorgulayan WEB istemcisine response (cevap) olarak yollayabilirsiniz.

At  GET veya POST ile verilerinizi yollayabilirsiniz. Projeniz kabul edecek be içeriği bir REQUEST.Content ile size sunacaktır.
Sizin yapacağınız bu içeriği PARSE ederek size gereken kaynak veriyi elde etmek ve sonucu aldığınızı veya varsa cevabınızı RESPONSE.Content olarak atamak. Bu arada hangi IP/HOST/ WebBrowser/Referer vs. WEB üzerine olabilecek tüm veri yine sizin önünüze akacaktır. 

Idea  Size bir de bonus olarak Image stream edebilmeyi dahil ettim. Yani bir resmi WEB çağrısına nasıl eklediğimizi de proje kaynak kodlarıyla irdeleyebilirsiniz.

Idea  Local Ağ'da herhangi bir sorun olmayacaktır. Ancak !!!

Exclamation  WEB üzerinden gelen çağrıları kabul için modem / ağ  PORT yönlendirme bilgisi olmayanlar

- Lütfen öncelikle WEB üzerinden belirlediğiniz PORT numarasından gelen çağrıları, dahili ağınızdaki projenizin olduğu bilgisayara yönlendirme nasıl yapılır ( ROUTING ) üzerine makalelere yeniden bir göz atınız. Bunun önemle altını çiziyorum. Keza bu ve benzeri sistemlerin çalışması, gelen çağrıların size ulaşmasıyla orantılıdır.


{***************************************************************************}
{                                                                           }
{                            WSDL Helper  Class                             }
{                                                                           }
{                    Copyright © 2016 Muharrem ARMAN                      }
{                         muharrem.arman@trt.net.tr                         }
{                                                                           }
{***************************************************************************}
{                                                                           }
{  Suya SOAP'a Dokunmadan [ : ) ] Web Service Altyapısını tek bir           }
{  HelperUnit ile projenize kazandıran altyapıdır                           }
{                                                                           }
{  USES listesine bu UNIT'in eklenmesi yeterlidir.                          }
{  Ekstra bir tanımlamaya gerek yoktur.                                     }
{  Gerekli WebService sınıfı kendiliğinden create edilecek, OnWebCagriGeldi }
{  eventi atanmışsa çağrı projeniz tarafından dikkate alınacaktır.          }
{                                                                           }
{  Kullanımı :                                                              }
{ (1) Formunuzun Private kısmına aşağıdaki tanımı ekleyiniz...              }
{                                                                           }
{   procedure OnWebCagriGeldi(Sender: TObject; Request : TWebRequest;       }
{                                                Response: TWebResponse );  }
{                                                                           }
{ (2) Formun OnCreate olayına da aşağıdaki size özel tanımları yapınız.     }
{                                                                           }
{ xWSDLHelper.DefaultPort  := 7000; // sizin için uygun olanı neyse         }
{ xWSDLHelper.ServerActive := True;                                         }
{ xWSDLHelper.OnWebCagriGeldi := OnWebCagriGeldi;                           }
{                                                                           }
{ (3) OnWebCagriGeldi olayına da aşağıdaki dilediğinizi yapınız.            }
{                                                                           }
{  procedure TForm1.OnWebCagriGeldi(Sender: TObject; Request : TWebRequest; }
{                                                  Response: TWebResponse );}
{  Var                                                                      }
{    strMesaj : WideString;                                                 }
{  begin                                                                    }
{    Memo1.Lines.BeginUpdate;                                               }
{      Memo1.Lines.Add( 'RemoteIp  : ' + Request.RemoteIP   );              }
{      Memo1.Lines.Add( 'RemoteHost: ' + Request.RemoteHost );              }
{      Memo1.Lines.Add( 'From      : ' + Request.From       );              }
{      Memo1.Lines.Add( 'Host      : ' + Request.Host       );              }
{      Memo1.Lines.Add( 'RemoteAddr: ' + Request.RemoteAddr );              }
{      Memo1.Lines.Add( 'URL       : ' + Request.URL        );              }
{      Memo1.Lines.Add( 'Content   : ' + Request.Content    );              }
{    Memo1.Lines.EndUpdate;                                                 }
{    strMesaj := '<html>'                                                   }
{            + '<meta http-equiv=Content-Type content="text/html;'          }
{            + ' charset=Windows-1254">'                                    }
{            + '<body>'                                                     }
{            + 'Merhaba.'                                + '</br>'          }
{            + '<font color="red">Muharrem ARMAN</font>' + '</br>'          }
{            + 'Dinamik WebService TEST...'                      + '</br>'  }
{            + '<img src="Resim_01">' + '</br>'                             }
{            + '<img src="Resim_01">' + '</br>'                             }
{            + '<img src="Resim_01">' + '</br>'                             }
{            + '<img src="Resim_01">' + '</br>'                             }
{            ;                                                              }
{    if String(Request.Host) = String(Request.RemoteAddr)                   }
{      then strMesaj := strMesaj + 'Beni şu IP''den çağırdınız : '          }
{                                + String(Request.Host) + '</br>'           }
{      else strMesaj := strMesaj + 'Beni şu DOMAIN ile çağırdınız : '       }
{                                + String(Request.Host) + '</br>';          }
{                                                                           }
{    strMesaj := strMesaj + 'Sizin IP Adresiniz : '                         }
{                         + String(Request.RemoteAddr) + '</br>'            }
{                         + '</body></html>';                               }
{    Response.Content     := strMesaj;                                      }
{  end;                                                                     }
{                                                                           }
{***************************************************************************}
{                                                                           }
{  Üzerinde değişiklik yapmak serbesttir ancak lütfen bu etiket bloğu       }
{  içine yaptığınız değişikliği ve künyenizi yazmayı ihmal etmeyiniz.       }
{                                                                           }
{***************************************************************************}
{  Değişikliği Yapan,  Yapılan Ekleme/Değişiklik bilgisi :                  }
{                                                                           }
{                                                                           }
{                                                                           }
{***************************************************************************}

Unit WSDL_HelperUnit;

interface

Uses
  Windows, SysUtils, Classes,
  IdHTTPWebBrokerBridge, WebReq, HTTPApp;

Type
  tARMAN_WSDL      = class(TWebModule)
  private
    procedure ARMAN_DefaultHandlerAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
    function  ResimGonder(ResStream: TResourceStream; Response: TWebResponse): Boolean;
    procedure Resim_01_Action(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
  public
    constructor Create(AOwner: TComponent); override;
  end;

Type
  TOnWebCagriEvent = procedure(Sender: TObject; Request : TWebRequest; Response: TWebResponse ) of object;
  TWSDL_Helper     = Class(TObject)
  private
    FServer           : TIdHTTPWebBrokerBridge;
    FDefPort          : Integer;
    FOnWebCagriEvent  : TOnWebCagriEvent;
    Function    FDefPortGet : Integer;
    Procedure   FDefPortSet( DefPort: Integer );
    procedure   FServerActivate( boolDurum: boolean = true );
    function    FIsServerActive: Boolean;
  public
    constructor Create;
    destructor  Destroy; Override;
    property    DefaultPort : Integer read FDefPortGet write FDefPortSet;
    property    ServerActive: boolean read FIsServerActive write FServerActivate;
    property    OnWebCagriGeldi: TOnWebCagriEvent read FOnWebCagriEvent write FOnWebCagriEvent;
  end;

Var
  WebModuleClass : TComponentClass = tARMAN_WSDL;
  xWSDLHelper    : TWSDL_Helper;
  xTest          : tARMAN_WSDL;

implementation
{$R RES\RES.RES} // basit Form Object ve Resim JPG dosyası bulunduruyor.

{ TWSDL_Helper }

constructor TWSDL_Helper.Create;
begin
  inherited;
  if WebRequestHandler <> nil then
    WebRequestHandler.WebModuleClass := WebModuleClass;

  // Create server.
  FServer := TIdHTTPWebBrokerBridge.Create;
  // Register web module class.
  FServer.RegisterWebModuleClass( tARMAN_WSDL );

end;

destructor TWSDL_Helper.Destroy;
begin
  FServer.Active := False;
  FServer.Bindings.Clear;
  FreeAndNil(FServer);
  inherited;
end;

function TWSDL_Helper.FDefPortGet: Integer;
begin
  Result := FDefPort;
end;

procedure TWSDL_Helper.FDefPortSet(DefPort: Integer);
begin
  FDefPort := DefPort;
  if FServer.Active
    then FServer.Active := False;

  FServer.Bindings.Clear;

  // Set default port.
  FServer.DefaultPort := FDefPort;
  // Start server.
  FServer.Active := True;
end;

function TWSDL_Helper.FIsServerActive: Boolean;
begin
  Result := FServer.Active;
end;

procedure TWSDL_Helper.FServerActivate(boolDurum: boolean);
begin
  if FServer.Active
    then FServer.Active := False;
  FServer.Bindings.Clear;
  FServer.Active := boolDurum;
end;

{ tARMAN_WSDL }

constructor tARMAN_WSDL.Create(AOwner: TComponent);
begin
  inherited;
  // Varsayalın (Default) Action Ekledim.
  With Actions.Add do
  begin
    Default  := True;
    Name     := 'DefaultHandler';
    PathInfo := '/';
    OnAction := ARMAN_DefaultHandlerAction;
  end;

  // Yeni bir Action Ekledim. Kodla ekledim açıklayıcı olsun istedim.
  With Actions.Add do
  begin
     Default    := False;
     Enabled    := True;
     MethodType := mtAny;
     Name       := 'R01_Resim';
     PathInfo   := 'Resim_01';
     OnAction   := Resim_01_Action;
  end;
end;

procedure tARMAN_WSDL.ARMAN_DefaultHandlerAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
Var
  strMesaj : String;
begin
//  Handled := True;
  if Assigned( xWSDLHelper.OnWebCagriGeldi ) then
  begin
    xWSDLHelper.OnWebCagriGeldi( sender, Request, Response );
  end else
  begin
    strMesaj := '<html>'
              + '<meta http-equiv=Content-Type content="text/html; charset=Windows-1254">'
              + '<body>'
              + 'Merhaba.'                                + '</br>'
              + '<font color="red">Muharrem ARMAN</font>' + '</br>'
              + 'WebService TEST...'                      + '</br>'
              + '<img src="' + String(Request.URL) + 'Resim_01">' + '</br>'
              ;

    if String(Request.Host) = String(Request.RemoteAddr)
      then strMesaj := strMesaj + 'Beni şu IP''den çağırdınız : '+ String(Request.Host) + '</br>'
      else strMesaj := strMesaj + 'Beni şu DOMAIN ile çağırdınız : '+ String(Request.Host) + '</br>';

    strMesaj := strMesaj + 'Sizin IP Adresiniz : '              + String(Request.RemoteAddr) + '</br>'
                         + '</body></html>';
    Response.Content     := strMesaj;
  end;
end;

function tARMAN_WSDL.ResimGonder( ResStream:TResourceStream; Response: TWebResponse ): Boolean;
begin
  try
    ResStream.Position     := 0;
    Response.ContentStream := ResStream;
    Response.ContentType   := 'image/jpeg';
    Response.SendResponse;
    Result := True;
  //Dikkat: FileStream FREE edilmeyecek çünkü yayındayız...
  except
    on E: Exception do begin
      Response.Content := '<html><body>Bir hata ile karşılaşıldı...' +
        E.ClassName + ': ' + E.Message + '</body></html>';
      Result := False;
    end;
  end;
end;

procedure tARMAN_WSDL.Resim_01_Action(Sender: TObject; Request: TWebRequest;
  Response: TWebResponse; var Handled: Boolean);
begin
  Handled := True;
  // Response edilirken HTML içerisinde "Resim_01" kullanılan yerlerde
  // bu Action devreye girererek daha önce belirlediğimiz resmi yollar...
  ResimGonder( TResourceStream.Create(HInstance, Format('img_%.2d', [1]), RT_RCDATA), Response );
end;


initialization
  xWSDLHelper := TWSDL_Helper.Create;

finalization
  FreeAndNil(xWSDLHelper);

end.

Arrow   Bu Unit ve örnek projeyi Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol.

Örnek Proje Unit İçerik
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons,

  WSDL_HelperUnit, Web.HTTPApp, Vcl.Samples.Spin;

type
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    Memo1: TMemo;
    SpinEdit1: TSpinEdit;
    procedure BitBtn1Click(Sender: TObject);
    procedure OnWebCagriGeldi(Sender: TObject; Request : TWebRequest; Response: TWebResponse );
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  ReportMemoryLeaksOnShutdown := true;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  xWSDLHelper.DefaultPort  := SpinEdit1.Value;
  xWSDLHelper.ServerActive := True;
  xWSDLHelper.OnWebCagriGeldi := OnWebCagriGeldi;
end;

procedure TForm1.OnWebCagriGeldi(Sender: TObject; Request : TWebRequest; Response: TWebResponse );
Var
  strMesaj : WideString;
begin
  Memo1.Lines.BeginUpdate;
    Memo1.Lines.Add( 'RemoteIp  : ' + Request.RemoteIP   );
    Memo1.Lines.Add( 'RemoteHost: ' + Request.RemoteHost );
    Memo1.Lines.Add( 'From      : ' + Request.From       );
    Memo1.Lines.Add( 'Host      : ' + Request.Host       );
    Memo1.Lines.Add( 'RemoteAddr: ' + Request.RemoteAddr );
    Memo1.Lines.Add( 'URL       : ' + Request.URL        );
    Memo1.Lines.Add( 'Content   : ' + Request.Content    );
  Memo1.Lines.EndUpdate;
  strMesaj := '<html>'
          + '<meta http-equiv=Content-Type content="text/html; charset=Windows-1254">'
          + '<body>'
          + 'Merhaba.'                                + '</br>'
          + '<font color="red">Muharrem ARMAN</font>' + '</br>'
          + 'Dinamik WebService TEST...'                      + '</br>'
          + '<img src="Resim_01">' + '</br>'
          ;
  if String(Request.Host) = String(Request.RemoteAddr)
    then strMesaj := strMesaj + 'Beni şu IP''den çağırdınız : '+ String(Request.Host) + '</br>'
    else strMesaj := strMesaj + 'Beni şu DOMAIN ile çağırdınız : '+ String(Request.Host) + '</br>';

  strMesaj := strMesaj + 'Sizin IP Adresiniz : '              + String(Request.RemoteAddr) + '</br>'
                       + '</body></html>';
  Response.Content     := strMesaj;
end;

end.
Cevapla
#2
Tebrik ederim hocam. Son derece ayrıntılı, bir okadar da kaliteli hazırlanış bir makale.
Teşekkürler.
İyi çalışmalar.
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#3
Ellerinize sağlık.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#4
Öncelikle elinize saglik.
Clienttan nasil istek göndereceğimize dair bir ornek paylasabilir misiniz acaba?
Teşekkürler.
Cevapla
#5
Muharrem hocam bu ornek sanırım web servislerden ziyade web sunucu mantiginda calisiyor.
Web sevisler ile calisirken oncelikle import etmek zorunda oldugumuz bir wsdl var malum. "Suya soap'a dokunmadan" dediginizde bu wsdl dosyasini import etmeden servisteki metodlari runtime da tespit edip cagirabilen bir WSDL Helper Class sandim acikcasi Smile Öyle bir class olsaydi benim gibi tembel yazilimcilarin cok isine yarardi.
WWW
Cevapla
#6
Merhaba

Delphi ile web servis yazma konusunda uğraşıyorum. Delphinin kendi sihirbazı ve internette bulabildiğim sayılı kaynakları inceledim.
Geldiğim aşamada çalışan soap server ve client uygulamaları oluşturabiliyorum.
Fakat authentication problemini aşamadım.
Kullanıcı adı ve şifre ile bağlantı kurulması nasıl yapılır.

Server kısmını delphi ile yazmayı ve bağlanan clientlerin kullancı adı / şifre doğrulamasından geçmesini istiyorum.
Client kısmını muhtemelen farklı ortamlarda geliştrilecek. Benim problemim web servisi serveri delphi ile yazabilmek.

Konu hakkındaki tecrübelerinizi paylaşmanızı rica ederim.
Cevapla
#7
Merhabalar ,
Bu tarz işleri yapmak için genelde "SOAP Header" yapısı kullanılır, her metodun sonuna ilave olarak kullanıcıadı ve parola gibi ek parametre eklemek te bir yöntem ancak bence doğru yöntem değil. Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol bu linkte SOAP Server uygulamanız içinden size gelen SOAP mesajındaki "SOAP Header" ları nasıl okuyabileceğinizi örneklemiş, aynı linkte bir SOAP Client uygulaması içinde nasıl SOAP Header eklenir i de anlatmış.
İyi çalışmalar.
Cevapla
#8
Araştırma yaparken delphi de webservis konusunda ciddi bir kaynak sıkıntısı olduğunu anlamış oldum.

Ayrıca Delphi kullanıpda Indy kütüphanesini duymayan yoktur. Vatandaşın birisi 2000 li yıllarda IndyShop bileşenini yazmış.
Bunu görünce biraz ümitlendim Smile
Bu satırlar indysoap komponent yazarına ait:

Then, a couple of months ago, an IndySoap user with a depth of commitment to the code and with an architecture built on it contacted me and asked to me to update the code for the latest version of Delphi, and laid money on the table to make it happen (thanks).
So today I’m glad to announce a new version of IndySoap has been released through SourceForge (Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol). This version compiles and passes all tests under both Delphi XE3 and Delphi 5. Versions of Delphi prior to Unicode should still be supported, and XE2, and probably XE4.


Özetle IndySoap bileşeni ile proje geliştiren bir firma projeyi yeni versiyonlara taşımak
için masaya para koydu bu beni çok mutlu etti diyor ve uzun bir aradan sonra D5 ve XE3 e göre güncelleme yapıyor  ve Sourceforgeden paylaşıyor Smile

indysoap komponeti ile ilgilenmek isteyenler için link:
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol

Fakat Tokyo sürümde bu yeni yapıyı çalıştıramadım. Componentler kuruluyor fakat tasarım aşamasında hatalar veriyor.

Bir haftalık araştırma neticesinde web servis işini daha az bildiğim c# ile yazmaya karar verdim. Sad
Cevapla
#9
Merhabalar ,
Delphi nin her hangi bir sürümünde iyi kötü proje geliştirebilecek tecrübeye sahipseniz çok ta fazla ek bir bilgiye ihtiyaç duymadan SOAP Server uygulamaları geliştirebilirsiniz, siz tam olarak nerede takıldınız ? kullanıcı doğrulama kısmını SOAP header yapısıyla rahatça halledebilirsiniz, sizi vazgeçiren tam olarak nedir ? ben aktif bir şekilde 10 yıldan fazla süredir hemen hemen tüm Delphi sürümleriyle SOAP Server uygulamaları geliştirdim ve aktif bir şekilde geliştirmeye de devam ediyorum mümkün olduğunca yardımcı olmaya çalışırım.
Cevapla
#10
Merhaba vkmadan

İlgin için teşekkür ederim. Konu dışı olarak programcılık hayatıma Delphi 3 ile giriş yaptım. En çok sevdiğim sürümleri Delphi 5 ve 7 oldu nedense Smile

Benim uğraştığım alanlar, önceleri elektronik devreler ve plc scada sistemleri ile haberleşen sistemler , son zamanlarda ise Database ağırlıklı masaüstü uygulamalar geliştiriyorum. Web programcılığı ve teknolojileri ile çok fazla uğraşmadım haliyle web terminolojisi olan html, javascript vb konulara çok hakim değilim. Gördüğüm notasyonu okuma anlama ve değiştirme konularda birşeyler yapabilirim, fakat sıfırdan birşeyler yapma noktasında değilim.

Bir şeyler yapabilmek için öncelikle konuyu kavramak gerekiyor, Bu aralar benim için bilinmeyen şey web servis(di). Nasıl bir mekanizma ile çalışıyor, kısıtlamaları nelerdir, neler yapılabilir veya yapılamaz, güvenlik nasıl sağlanır, limitleri nelerdir vs. işin başında bir sürü bilinmeyen nokta var. Bilen birisi için çok kolay olan bir nokta, başka birisinin günlerini alabilir.

Hülasa C# ile Çarşamba günü başladığım servis yazma ve authentication, db bağlantısı ve iis e kayıt işlemleri i dün gece yarısı sularında gerçekleştirmiş oldum.

Delphi konusunda c# tan daha iyi durumdayım ve delphi ile program geliştirme işini daha çok seviyorum. Fakat son iki günde c ile uğraşırken karşılaştığım bir hata, hata kodu vs ile ilgili arama yapınca mutlaka karşına birden fazla cevap çıkıyor.

Umarım delphi, web servis komponentlerine temel gereklilik olan ilave özellikleri eklerler. Fakat bu konuya çok önem vermiyorlar gibi bir düşünceye sahibim.

Özetle web servis macerası konuyu buralara kadar getirdi.

Uygun vaktinizde soap server- client güvenlik doğrulamalı çalışan bir örnek hazırlayabilirseniz çok hayır duası alırsınız.

İlgilenen herkese teşekkür ederim.
Cevapla

Konuyu Paylaş : facebook gplus twitter





Konuyu Okuyanlar: 1 Ziyaretçi