首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Delphi SOAP调用显示IE登录对话框-如何防止它?

Delphi SOAP调用显示IE登录对话框-如何防止它?
EN

Stack Overflow用户
提问于 2020-11-10 11:28:02
回答 1查看 160关注 0票数 1

我们有两份申请。他们用SOAP协议给网站打电话。

其中一个在我们的登录表单中询问登录数据;另一个是后台进程,预定的任务。他们两人都用InternetSetOption来做基础工作。

如果用户键入错误的用户名或密码,SOAP调用将显示一个IE对话框,以再次获得用户名/密码。

1.)这不是我们的风格。2.)对话是“无限的”,它说,只有成功或取消退出重新展示。3.)我们无法控制,会出现多少次。4.)在后台进程中,对话框会停止进程--这是非常关键的。

因此,我需要一些选项,或事件,以防止显示IE登录对话框。

如果登录名/密码错误,则程序必须使用401中止,而不会无限地显示IE对话框。

我该怎么做?

请帮我拿些密码。谢谢!

一些代码片段。但我认为这没有太大帮助。这是一个简单的带有基本auth的SOAP调用。但如果登录不正确,IE将显示他的对话框。

代码语言:javascript
运行
复制
type TWSRIO = class(THTTPRIO)
...
end;

procedure TWSRIO.OnBeforePost(const HTTPReqResp: THTTPReqResp; Data:Pointer);
begin
  if Auth_Mod = SCRBRIO_Auth_Basic then
  begin
    if not InternetSetOption(Data,INTERNET_OPTION_USERNAME,PChar(FAuth_LoginName), Length(FAuth_LoginName)) then
        raise Exception.Create(SysErrorMessage(GetLastError));
    if not InternetSetOption(Data, INTERNET_OPTION_PASSWORD, PChar(FAuth_Password), Length(FAuth_Password)) then
        raise Exception.Create(SysErrorMessage(GetLastError));
  end;
end;

procedure TForm1.Test;
begin
  RIO := TWSRIO.Create(Self);
  RIO.Auth_Mode := SCRBRIO_Auth_Basic;
  RIO.Auth_LoginName := xxx;
  RIO.Auth_Password := yyy;
  ...
  o := GetStockQueryResponderInterface(False, GetURL(), RIO);
  o.GetStockQuery(sArtNr)
  ...
end;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-23 08:42:42

也许解决办法是:

代码语言:javascript
运行
复制
function TMyRIO.MyWiniNetError(LastError: DWord; Request: Pointer): DWord;
var
    OWEProc: TWinInetErrorEvent;
begin
    // When the LastError is zero, we return same code what the dialog does on Cancel
    if LastError = 0 then
    begin
        Result := ERROR_SUCCESS;
        Exit;
    end;
    if Assigned(HTTPWebNode) then
    begin
        try
            // Save old proc and set to nil for Avoid infinite loop
            OWEProc := Self.HTTPWebNode.OnWinInetError;
            Self.HTTPWebNode.OnWinInetError := nil;
            try
                // Call the original handler
                Result := Self.HTTPWebNode.HandleWinInetError(LastError, Request, True);
            finally
                // Restore our handler 
                Self.HTTPWebNode.OnWinInetError := OWEProc;
            end;
        except
            on E: Exception do
            begin
                // On  error we log the problem
                LogThis(E.Message);
                Result := ERROR_SUCCESS;
                Exit;
            end;
        end;
    end else
    begin
        Result := ERROR_SUCCESS;
        Exit;
    end;
end;

我不知道我们会有什么样的副作用。但是使用这段代码,我无法在错误的地址上获得Windows登录对话框。只是个错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64768139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档