2015-02-23 56 views
3

当我连接到使用基本身份验证使用下面的代码Web服务:如何停止验证对话框出现使用THTTPRIO

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

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

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

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

enter image description here

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

+0

这是THttpRio组件中的一个旧的未解决的错误。使用替代Indy – RBA 2015-02-23 13:13:07

+3

这是因为Delphi中的Web服务实现使用“错误的”Windows API - 使用WinInet而不是WinHTTP。正如MSDN明确指出的那样(https://msdn.microsoft.com/en-us/library/windows/desktop/aa382925%28v=vs.85%29.aspx),“WinINet显示一些操作的用户界面,如收集用户凭证,但是,WinHTTP以编程方式处理这些操作。“这也是非常危险的,因为如果您在服务中使用它,服务可能会“挂起”等待用户输入,因为该对话框不会显示在任何用户可访问的桌面上,所以无法输入。 – LDS 2015-02-23 13:22:20

+0

不知道这是否有用,因为我没有尝试过自己,我不确定它会停止'Windows'对话框,但可能事件处理程序'HTTPRIO.HTTPWebNode.OnWinInetError'可以携手?您需要检查“HTTP_STATUS_PROXY_AUTH_REQ”错误。 – 2015-02-23 13:31:22

回答

1

要捕获错误,您可以使用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 ... 
+0

虽然这是一种可行的解决方案,但感觉就像是一种黑客攻击。我们是否需要在每个连接之前加上上面的代码,或者做一次,并希望在初始检查后帐户凭证不会更改?然而,由于没有其他选择似乎有效,这可能是我们唯一的机会。谢谢mjn! – norgepaul 2015-02-23 18:12:24