我的Delphi 2010應用上傳東西使用多線程,上傳的數據張貼到PHP/Web應用程序需要登錄,所以我需要使用共享/全局Cookie管理器(我「M使用Indy10修訂4743),因爲TIdCookieManager不是線程安全:(全球,線程安全,餅乾管理與Indy
此外,服務器端,會話ID是每5分鐘自動重新生成,所以我必須保持同時全球&本地的cookie管理員同步。
我的代碼如下所示:
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;
但它不起作用!調用AddCookies當()
項目MYEXE.EXE引發的異常類EAccessViolation有消息 「訪問衝突在地址00000000讀取地址00000000的」我得到這個例外。
我也試過使用assign(),即。
TheCookieManager.CookieCollection.Assign(GlobalCookieManager.CookieCollection);
但我仍然得到同樣的異常,通常是在這裏:
TIdCookieManager.GenerateClientCookies()
任何人知道如何解決這一問題?
在OnNewCookie作業中,你在做什麼?當我看到多層指針轉換時,纏繞在一個匿名方法上,以'end)^)+ $ 0C)^;'結尾,我有點緊張。 –
我同意這不是最好的代碼,但正如我在代碼中寫的,OnNewCookie在那裏保持本地和全球Cookie管理器同步(並且,據我所知,問題不在於OnNewCookie事件) – TheDude
我同意@MasonWheeler。 OnNewCookie事件需要一個對象實例的非靜態方法,而不是匿名過程。 'TIdCookieManager'會傳遞一個隱藏的'Self'指針給事件處理程序,但是你的匿名參數並不能解決這個問題,所以剩下的事件參數會被搞亂。 –