Как предотвратить диалоговое окно (запрос базовой аутентификации) во время вызова Webservice - PullRequest
6 голосов
/ 18 февраля 2010

В программе delphi (работающей как служба) мне нужно вызвать некоторые веб-сервисы.
Вызовы работают нормально, если базовые аутентификации не требуются. Вызовы также работают нормально, если требуется базовая аутентификация и имя пользователя / пароль (в 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.

Ответы [ 3 ]

2 голосов
/ 18 февраля 2010

У меня была эта проблема при попытке запустить Windows Live Messenger через веб-фильтр.

Я закончил тем, что написал небольшую программу , которая периодически выполняет автоматическую аутентификацию.

Надеюсь, это вам тоже поможет.

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 голос
/ 18 февраля 2010

Как насчет проверки режима аутентификации серверов в первую очередь?

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

  • Клиент запрашивает страницу, требующую аутентификации, но не предоставляющую имя пользователя и пароль.Обычно это происходит потому, что пользователь просто вводил адрес или переходил по ссылке на страницу.
  • Сервер отвечает кодом ответа 401 и предоставляет область аутентификации.

Итак, клиентприложение-служба может отправить Get и посмотреть, имеет ли ответ заголовок, такой как

WW-Authenticate: Basic realm="Secure Area"
1 голос
/ 18 февраля 2010

Вы можете создать новый класс, который наследуется от 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;
...