6

delphiプログラム(サービスとして実行)では、いくつかのWebサービスを呼び出す必要があります。
基本的な認証が再取得されない場合、呼び出しは正常に機能します。基本認証が再取得され、以下を使用してユーザー名/パスワードが(BeforePostで)提供されている場合も、呼び出しは正常に機能します。

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

ただし、基本認証が再クエリされ、ユーザー名/パスワードが指定されていない場合、プログラムはユーザー名/パスワードのafプロンプトを表示します(これはサービスでのNO-GOです)。

では、プロンプトは必要ないが、代わりにエラーが必要であることをどのように通知できますか?

問題は、私が理解できるように、SOAPHTTPTrans関数THTTPReqResp.Send(const ASrc:TStream):Integer;にあります。(762行目(InternetErrorDlg iそのメソッドへの2回目の呼び出し))。

編集1:
sendメソッド(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インポーターを使用して生成されたインターフェースです。

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 に答える