2010-08-11 128 views
0

我發佈一些數據到一個http認證的網址與ASIFormDataRequest。ASIFormDataRequest-POST文件繼續似乎認證失敗後繼續

當身份驗證失敗並且調用身份驗證對話委託時,上傳過程似乎仍然完全進行。

因此,在這種情況下:

1)用戶的憑據尚未存儲在鑰匙串 2)存儲在鑰匙串用戶的憑證驗證失敗(過期等)

我見此行爲:

  • 我看到的請求來我 服務器,並拒絕錯誤 401返回給客戶端
  • uploadFailed委託不是調用 。
  • 進度條代表緩慢填充爲 該文件似乎仍然被推送到網絡連接上的 。它與 一致的時間 完成的時間量,以充分上傳
  • 內置的身份驗證對話框 模式出現
  • 用戶輸入正確的憑據
  • 進度條代表復位
  • 上傳重新開始 - 進度條 由於在 服務器上收到帖子數據而填充服務器
  • 完成的委託方法被稱爲 預計。
  • 一切都已經上傳就好 與第二次嘗試

這裏就是我安裝我的操作:

[self setRequest:[ASIFormDataRequest requestWithURL:uploadURL]]; 

[request setDelegate:self]; 
[request setDidFailSelector:@selector(uploadFailed:)]; 
[request setDidFinishSelector:@selector(uploadFinished:)]; 

[request setUseKeychainPersistence:TRUE]; 
[request setShouldPresentAuthenticationDialog:TRUE]; 
[request setShouldPresentCredentialsBeforeChallenge:TRUE]; 

[request setPostValue:captionTextField.text forKey:@"caption"]; 
[request setPostValue:[siteID stringValue] forKey:@"site_id"]; 
[request setFile:fileToUpload forKey:@"site_photo"]; 

[request setUploadProgressDelegate:progressView]; 
[request startAsynchronous]; 

我想我需要發出[申請取消]基於認證失敗,但我不確定我應該在哪裏做這件事。

即使在服務器返回了401之後,POST是否仍然會突然消失,這是否是預期的行爲?

欣賞任何指導或解決此問題的指針。

回答

0

這是HTTP客戶端很常見的行爲 - 他們不嘗試從服務器讀取回復直到他們完全發送請求,包括附件。

如果客戶端已經有來自同一服務器的請求,並且在同一會話中已經有401請求被拒絕,那麼這是客戶端的常見行爲 - 我不確定ASIHTTPRequest是否執行此操作,但是如果確實如此一種解決方案是在進行POST之前向服務器發出GET請求。如果GET已成功通過驗證,則應該爲該帖子發送緩存的憑據,因此不會出現401錯誤。

我能想到的唯一的其他選擇是轉而使用基於cookie的身份驗證,而不是使用基於cookie的身份驗證,而不是使用自定義http頭中的身份驗證。但我認爲我首先提出GET請求的建議可能是最好的方法。

+0

謝謝 - 我已經開始在POST之前進行初始GET。在其他情況下,我使用了基於cookie的認證機制,但由於各種原因,在這種特殊情況下需要使用HTTP基本功能。 – Nick 2010-08-17 02:04:58

1

401「錯誤」是HTTP狀態碼,而不是請求失敗。你的請求經過了好的,你得到了一個響應,這恰好是一個認證錯誤通知。您有責任處理回覆,無論它是什麼。

There are many possible status codes您可以從除401以外的成功請求中獲得。順便說一句,您可能還想考慮如何處理這些類型的響應,具體取決於最終用戶在做什麼以及哪些響應是合適的。

方法-uploadFinished:通常不應等待數據完全上傳,然後才能看到任何NSLog聲明或其他通知完成請求。

這麼一件事做的是改變-uploadFailed:-uploadFinished:方法名-requestFailed:-requestFinished:更準確地反映什麼是應用程序的邏輯發生。

在您委託的-requestFinished:方法,檢查requestresponseStatusCode財產併發出相應的命令:

- (void) requestFinished:(ASIHTTPRequest *)request { 
    if ([request responseStatusCode] == 401) { 
     // 
     // cancel the current request and/or trigger a new, 
     // separate authentication request, passing along a 
     // reference to the request's body data, etc. 
     // 
    } 
} 
+0

根據請求獲取的點數與上傳命名和錯誤與狀態代碼的比較。通常,我發現人們通常會在4xx範圍內調用任何「錯誤」,但您是正確的,我很欣賞這些反饋。 我在完成的代理中尋找這個狀態代碼,但是直到所有的數據都被髮送後代理纔會被調用 - 我想我錯誤地認爲401響應會被返回,並且代表在調用所有數據之前被調用多部分表格已發送。我想我需要在嘗試POST之前驗證我的身份驗證,或者看看我是否早先使用didRecieveData獲得401。 – Nick 2010-08-12 03:25:40