6

在一个 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 中)更改为包括 INTERNET_FLAG_NO_AUTH,它会按我的意愿工作。
但是如何在不更改 SAOPHTTPTrans(如果可能)的情况下做到这一点?

编辑2:

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 导入器生成的接口。

4

3 回答 3

2

我在尝试让 Windows Live Messenger 通过 Web 过滤器工作时遇到了这个问题。

我最终编写了一个小程序,每隔一段时间就自动进行身份验证。

希望这对你也有帮助。

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);
...
于 2010-02-18T14:13:23.663 回答
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;
于 2010-02-18T10:29:55.187 回答
1

先检查一下服务器的认证方式怎么样?

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

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

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

WW-Authenticate: Basic realm="Secure Area"
于 2010-02-18T16:53:17.317 回答