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