В программе Дельфи (работающий как услуга) я должен назвать некоторые веб-сервисы.
Вызовы хорошо работают, если стандартная аутентификация не является requerired. Вызовы также хорошо работают, если Стандартная аутентификация является requerired, и имя пользователя введено (в BeforePost) использование:
InternetSetOption(Data, INTERNET_OPTION_USERNAME,...
InternetSetOption(Data, INTERNET_OPTION_PASSWORD,...
Но если Стандартная аутентификация Повторно запрашивается, и имя пользователя не введено, программа поднимает подсказку AF для имени пользователя/пароля (thats ОСТАНОВКА в servcice).
Таким образом, как я могу предупредить, что не хочу подсказку, но вместо этого ошибку?
Проблема, поскольку я могу se, это, в SOAPHTTPTrans функционирует THTTPReqResp. Отправьте (константа ASrc: TStream): Целое число; (строка 762 (второй вызов к InternetErrorDlg i тот метод)).
EDIT1:
если я изменяю Флаги в начале отправить метода (в SOAPHTTPTRANS) для включения 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.
Вы можете создать новый класс, который наследуется от THTTPReqResp и переопределить метод send так, чтобы вы могли включать свои собственные флаги. Вы должны быть в состоянии установить ws.HTTPWebNode на новый узел, используя новый класс.
Something Like
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;
У меня возникла проблема при попытке разрешить Windows Live Мессенджер работает через веб-фильтр.
Я закончил тем, что написал небольшую программу , которая время от времени выполняет автоматическую аутентификацию.
Надеюсь, это вам тоже поможет.
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);
...
Как насчет того, чтобы сначала проверить режим аутентификации серверов?
http://en.wikipedia.org/wiki/Basic_access_authentication
Таким образом, приложение клиентской службы может отправить Get и посмотреть, есть ли в ответе заголовок типа
WW-Authenticate: Basic realm="Secure Area"