如何在调用Webservice期间阻止对话框(基本身份验证提示)

时间:2010-02-18 08:33:39

标签: delphi soap delphi-2007 wininet

在delphi程序中(作为服务运行)我需要调用一些web服务 如果不重新修改基本身份验证,则调用可以正常工作。如果使用以下方式修改基本身份验证并提供用户名/密码(在BeforePost中),这些调用也可以正常工作:

InternetSetOption(Data, INTERNET_OPTION_USERNAME,...
InternetSetOption(Data, INTERNET_OPTION_PASSWORD,...

但是如果基本身份验证被重新获得,并且没有提供用户名/密码,程序将提示用户名/密码(即服务中的NO-GO)。

那么我怎么能发出信号,我不想要提示,而是一个错误?

问题是,正如我可以看到的那样,在SOAPHTTPTrans函数中THTTPReqResp.Send(const ASrc:TStream):Integer; (第762行(第二次调用InternetErrorDlg即该方法))。

EDIT1:
如果我在发送方法的开头(在SOAPHTTPTRANS中)更改Flags以包含INTERNET_FLAG_NO_AUTH,它可以按照我的意愿工作。
但是如何在不改变SAOPHTTPTrans的情况下做到这一点(如果可能的话)?

EDIT2:

ws := THTTPRIO.Create(Self);
ws.URL := 'http://excample.com/ws.asmx';
ws.HTTPWebNode.InvokeOptions := [soIgnoreInvalidCerts];
ws.HTTPWebNode.OnBeforePost := WebServiceCallBeforePost;
AvailabilityWebservice := (ws as AvailabilityServiceSoap);
sTemp := AvailabilityWebservice.GetVersion;

其中AvailabilityServiceSoap是使用WSDL导入程序生成的接口。

3 个答案:

答案 0 :(得分:2)

尝试让Windows Live Messenger通过网络过滤器时,我遇到了这个问题。

我最终写了一个small program,每隔一段时间就自动验证一次。

希望这对你也有帮助。

uses
  ... IdHTTP ...;

...
var
  httpGetter: TIdHTTP;
...    
httpGetter.Request.Username := username;
httpGetter.Request.Password := password;
httpGetter.HandleRedirects := True;
httpGetter.Request.BasicAuthentication := True;

//custom useragent required to let live messenger work
//this part is probably not necessary for your situation
httpGetter.Request.UserAgent := 'MSN Explorer/9.0 (MSN 8.0; TmstmpExt)';

httpGetter.Get(url,MS);
...

答案 1 :(得分:1)

您可以创建一个继承自THTTPReqResp的新类并覆盖send方法,以便您可以包含自己的标志。您应该能够使用新类将ws.HTTPWebNode设置为新节点。

喜欢的东西

ws := THTTPRIO.Create(Self);
MyNewNode := MyNewClass.Create;
ws.HTTPWebNode := MyNewNode;
ws.URL := 'http://excample.com/ws.asmx';
ws.HTTPWebNode.InvokeOptions := [soIgnoreInvalidCerts];
ws.HTTPWebNode.OnBeforePost := WebServiceCallBeforePost;
AvailabilityWebservice := (ws as AvailabilityServiceSoap);
sTemp := AvailabilityWebservice.GetVersion;

答案 2 :(得分:1)

如何首先检查服务器身份验证模式?

http://en.wikipedia.org/wiki/Basic_access_authentication

  • 客户端要求提供一个页面 需要身份验证但不需要 提供用户名和密码。 通常这是因为用户 只需输入地址或 点击页面链接。
  • 服务器以401响应 响应代码并提供 认证领域。

因此,客户端服务应用程序可以发送Get并查看响应是否具有类似

的标头
WW-Authenticate: Basic realm="Secure Area"