Thema: Delphi SOAP Login (einmalig)

Einzelnen Beitrag anzeigen

Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.606 Beiträge
 
#3

Re: SOAP Login (einmalig)

  Alt 16. Okt 2008, 20:14
Ich haaaaabs

Aaalso, folgendes:

Man muss dem WebService ein THttpRio Objekt mitgeben. Defaultmässig ist das nil und dann wird ein standard-Objekt verwendet.
Diesem selber erstellen THttpRio-Objekt (oder besser: dessem HttpWebNode) weisen wir einen Eventhandler zu, der ausgeführt wird, bevor der Webservice einen http-Request abschickt.

In diesem Eventhandler setzen wir auf dem aktuellen Request dann die nötigen Header für die Http Basic Authentication. Also Username & Passwort. Beispielhaft setze ich hier auch noch nen Timeout.

Achtung: Wenn Benutzername oder Kennwort falsch sind, und der Server einen 401 schickt, dann kommt der Dialog zumindest bei mir im Moment immer noch hoch. Ich weiss grad ned, wie ich den ausschalte. Aber zumindest initial kann man hiermit Benutzer und Kennwort setzen und somit den Dialog (sofern die Anmeldedaten richtig sind) unterdrücken.

Delphi-Quellcode:
uses
   SOAPHTTPClient, SOAPHTTPTrans, WinInet,

type
   TForm1 = class(TForm)
      btnConnectServer: TButton;
      edtUrl: TEdit;
      edtUser: TEdit;
      edtpassword: TEdit;
      procedure btnConnectServerClick(Sender: TObject);
      procedure FormClose(Sender: TObject; var Action: TCloseAction);
   private
      rio: THttpRio;
      rptSvc: ReportingService2005Soap; // das ist aktuell mein Webservice
      procedure HttpRioHttpWebNodeBeforePost(const HTTPReqResp: THTTPReqResp; Data: Pointer);
      { Private declarations }
   public
      { Public declarations }
   end;

implementation

procedure TForm1.HttpRioHttpWebNodeBeforePost(
   const HTTPReqResp: THTTPReqResp; Data: Pointer);
var TimeOut : integer;
begin
   TimeOut := 2000; // in milleseconds.
   if not InternetSetOption(Data,
         INTERNET_OPTION_RECEIVE_TIMEOUT,
         Pointer(@TimeOut),
         SizeOf(TimeOut)) then
   ShowMessage(SysErrorMessage(GetLastError));

   if not InternetSetOption(Data,
                      INTERNET_OPTION_USERNAME,
                      PChar(rio.HTTPWebNode.UserName),
                      Length(rio.HTTPWebNode.UserName)) then
       ShowMessage(SysErrorMessage(GetLastError));

   if not InternetSetOption(Data,
                      INTERNET_OPTION_PASSWORD,
                      PChar(rio.HTTPWebNode.Password),
                      Length (rio.HTTPWebNode.Password)) then
       ShowMessage(SysErrorMessage(GetLastError));
end;

// Aufräumen
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   if Assigned(rptSvc) then
      rptSvc._Release();

   if Assigned(rio) then
      FreeAndNil(rio);
end;

procedure TForm1.btnConnectServerClick(Sender: TObject);
begin
   // Initialize additional params (like eventhandler for http basic authentication)
   if not Assigned(rio) then
   begin
      rio := THTTPRIO.Create(self);
      rio.HTTPWebNode.UserName := edtUser.Text;
      rio.HTTPWebNode.Password := edtpassword.Text;
      rio.HTTPWebNode.OnBeforePost := self.HttpRioHttpWebNodeBeforePost;
   end;

   // Create Web Service IDispatch interface with additional params here:
   if not assigned(rptSvc) then
   begin
      rptSvc := ReportService2005.GetReportingService2005Soap(false, edtUrl.Text, rio);
   end;

Meine Quellen waren:
http://shenoyatwork.blogspot.com/200...ter-break.html
http://shenoyatwork.blogspot.com/200...lphi-soap.html
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat