My Delphi 2010アプリケーションはマルチスレッドを使用してアップロードします。アップロードされたデータはログインが必要なPHP/Webアプリケーションにポストされます。共有/グローバルクッキーマネージャーを使用する必要がありますIndy10リビジョン4743)を使用して「メートルTIdCookieManagerは:(-スレッドセーフされていないためIndyのグローバルでスレッドセーフなクッキーマネージャー
また、サーバ側では、セッションIDは、自動的に5分ごとに再生成されるので、私はグローバル&ローカルクッキーの両方を維持する必要があります管理者は同期しています
私のコードは次のようになります:
TUploadThread = class(TThread)
// ...
var
GlobalCookieManager : TIdCookieManager;
procedure TUploadThread.Upload(FileName : String);
var
IdHTTP : TIdHTTP;
TheSSL : TIdSSLIOHandlerSocketOpenSSL;
TheCompressor : TIdCompressorZLib;
TheCookieManager : TIdCookieManager;
AStream : TIdMultipartFormDataStream;
begin
ACookieManager := TIdCookieManager.Create(IdHTTP);
// Automatically sync cookies between local & global Cookie managers
@TheCookieManager.OnNewCookie := pPointer(Cardinal(pPointer(procedure(ASender : TObject; ACookie : TIdCookie; var VAccept : Boolean)
begin
OmniLock.Acquire;
try
GlobalCookieManager.CookieCollection.AddCookie(ACookie, TIdHTTP(TIdCookieManager(ASender).Owner).URL{IdHTTP.URL});
finally
OmniLock.Release;
end; // try/finally
VAccept := True;
end)^) + $0C)^;
// ======================================== //
IdHTTP := TIdHTTP.Create(nil);
with IdHTTP do
begin
HTTPOptions := [hoForceEncodeParams, hoNoParseMetaHTTPEquiv];
AllowCookies := True;
HandleRedirects := True;
ProtocolVersion := pv1_1;
IOHandler := TheSSL;
Compressor := TheCompressor;
CookieManager := TheCookieManager;
end; // with
OmniLock.Acquire;
try
// Load login info/cookies
TheCookieManager.CookieCollection.AddCookies(GlobalCookieManager.CookieCollection);
finally
OmniLock.Release;
end; // try/finally
AStream := TIdMultipartFormDataStream.Create;
with Stream.AddFile('file_name', FileName, 'application/octet-stream') do
begin
HeaderCharset := 'utf-8';
HeaderEncoding := '8';
end; // with
IdHTTP.Post('https://www.domain.com/post.php', AStream);
AStream.Free;
end;
しかし、動作しません! ()
プロジェクトMyEXE.exe「のアドレス00000000の読み取りアドレス00000000でアクセス違反」というメッセージ で例外クラスのEAccessViolationを上げAddCookiesを呼び出すときに、私はこの例外を取得しています。
私もassign()を使って試しました。
TheCookieManager.CookieCollection.Assign(GlobalCookieManager.CookieCollection);
しかし、私はまだ、通常はここで、同じ例外を取得:
TIdCookieManager.GenerateClientCookies()
誰もがこの問題を解決する方法を知っていますか?
あなたはOnNewCookie割り当てで何をやっていますか?私がポインタキャストの複数のレイヤーを見て、匿名メソッドをラップし、 'end)^)+ $ 0C)^;'のようなもので終わると、少し神経質になります。 –
私はそれが最高のコードではないことに同意しますが、コードで書いたように、OnNewCookieはローカルとグローバルの両方のCookieマネージャを同期させて保持します(そして、問題がOnNewCookieイベントでない限り、私にはわかります)。 – TheDude
私は@MasonWheelerに同意します。 OnNewCookie'イベントは、オブジェクトインスタンスの非静的メソッドであり、匿名プロシージャではありません。 'TIdCookieManager'は隠れた' Self'ポインタをイベントハンドラに渡しますが、あなたの匿名パラメータはそれを考慮していないので、残りのイベントパラメータはうまくいきません。 –