2010-02-18 14 views
6

Dans un programme Delphi (exécuté en tant que service), j'ai besoin d'appeler certains services Web.
Les appels fonctionnent correctement si les authentifications de base ne sont pas requises. Les appels fonctionne aussi bien si l'authentification de base est requerired et nom d'utilisateur/mot de passe est fourni (en BeforePost) en utilisant:Comment empêcher la boîte de dialogue (invite d'authentification de base) pendant l'appel du Webservice

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

Mais si l'authentification de base est Requeried et nom d'utilisateur/mot de passe est fourni, le programme évoque af rapide pour le nom d'utilisateur/mot de passe (c'est un NO-GO dans un service).

Alors, comment puis-je signaler que je ne veux pas une invite, mais plutôt une erreur?

Le problème est, comme je peux le voir, dans la fonction SOAPHTTPTrans THTTPReqResp.Send (const ASrc: TStream): Integer; (ligne 762 (deuxième appel à InternetErrorDlg dans cette méthode)).

EDIT1:
si je change les drapeaux au début de la méthode d'envoi (en SOAPHTTPTRANS) pour inclure INTERNET_FLAG_NO_AUTH, cela fonctionne comme je le voulais.
Mais comment puis-je faire cela sans changer le SAOPHTTPTrans (si possible)?

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; 

Lorsque AvailabilityServiceSoap est l'interface générée à l'aide de l'importateur WSDL.

+0

vous ne pouvez pas exécuter votre service sans interaction de bureau? Cela pourrait transformer le comportement actuel en erreur. –

+0

Comment utilisez-vous l'objet THTTPReqResp? dans le cadre de TSOAPConnection? –

+0

Jeroen: Je n'ai pas encore essayé, mais le problème est que le stock du processus attend l'entrée, donc il se prépare à être hangig. – BennyBechDk

Répondre

1

Vous pouvez créer une nouvelle classe qui hérite de THTTPReqResp et remplacer la méthode d'envoi afin que vous puissiez inclure vos propres indicateurs. Vous devriez pouvoir définir ws.HTTPWebNode sur un nouveau noeud en utilisant la nouvelle classe.

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; 
+0

Cela semble être une solution réalisable, je n'aime pas avoir à copier les 170 lignes de THTTPReqResp.Send. Donc, s'il y a un moyen de l'atteindre sans copier ce code, il semble préférable. – BennyBechDk

+0

J'ai essayé de copier la méthode Send sur mon propre objet, mais de nombreuses variables privées ont été utilisées. Donc, il faut le faire fonctionner l'ensemble de l'unité doit être copié et modifié. – BennyBechDk

+0

Que se passe-t-il dans l'avant-poste? Puisque vous le montrez, et puisque je sais que vous avez probablement besoin d'appeler InternetSetOption, la réponse serait meilleure. –

2

J'ai eu ce problème en essayant de laisser Windows Live Messenger travail à travers un filtre web.

J'ai fini par écrire un small program qui s'auto-authentifie de temps en temps.

Espérons que cela vous aide aussi.

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); 
... 
+0

Il ne permet pas de résoudre le problème. Le problème est lorsque le nom d'utilisateur et mot de passe n'est pas entré, le programme affiche une invite af attend (et en cours d'exécution en tant que service sur un serveur sans surveillance, ce n'est pas dieu). Je serais heureux de recevoir une erreur, et de gérer cela comme toute autre erreur. – BennyBechDk

1

Comment vérifier le mode d'authentification des serveurs en premier?

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

  • Le client demande une page qui requiert une authentification mais n'a pas fournir un nom d'utilisateur et mot de passe. Typiquement c'est parce que l'utilisateur simplement entré l'adresse ou suivi d'un lien vers la page.
  • Le serveur répond avec le code de réponse 401 et fournit le domaine d'authentification .

Ainsi, l'application de service client peut envoyer un Get et voir si la réponse a une tête comme

WW-Authenticate: Basic realm="Secure Area"