我正在使用以下代码使用基本身份验证连接到Web服务:

var
  RIO: THTTPRIO;
begin
  RIO := THTTPRIO.Create(nil);

  EndPoint := GetWebServicePort(True, '', RIO);

  RIO.HTTPWebNode.UserName := 'xxxx';
  RIO.HTTPWebNode.Password := 'yyyy';
...
end;


如果用户名和密码正确,则一切正常。但是,如果它们不正确,则会弹出一个Windows对话框,要求提供正确的凭据。而不是对话框,我需要捕捉错误。



如何停止弹出对话框?我已经搜索并找到了两个结果(Link 1Link 2),但似乎都没有提供真正的解决方案。

最佳答案

要捕获该错误,可以使用HTTP客户端库(例如Indy TIdHTTP)首先在Web服务地址上运行HTTP GET(或HEAD)请求,并捕获当用户名/密码错误时引发的异常。

uses
  ... IdHTTP ...;

...
var
  HTTP: TIdHTTP;

ValidCredentials := False;
...
HTTP.Request.Username := username;
HTTP.Request.Password := password;
HTTP.Request.BasicAuthentication := True;
try
  HTTP.Head(url);
  ValidCredentials := HTTP.ResponseCode = 200;
except
  on ... (some Indy exception) do
  begin
    // signal that username / password are incorrect
    ...
  end;
end;

if ValidCredentials then
begin
  // invoke Web Service ...

09-30 11:27