簡體   English   中英

ASIFormDataRequest-驗證失敗后,文件的POST繼續似乎繼續

[英]ASIFormDataRequest- POST of file continues seems to continue after authentication fails

我正在使用ASIFormDataRequest將一些數據發布到經過HTTP身份驗證的url中。

當身份驗證失敗並且身份驗證對話框委托被調用時,上傳進度似乎仍將繼續進行。

因此,在這些情況下:

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];

我以為驗證失敗時需要發出[request cancel],但是我不確定應該在哪里進行。

是否在服務器返回401之后POST仍會掉電的預期行為?

感謝所有解決此問題的指南或指針。

401“錯誤”是HTTP狀態代碼,而不是請求失敗。 您的請求通過了,您得到了響應,它恰好是身份驗證錯誤通知。 您有責任處理響應,無論響應如何。

除了401之外,您還可以從成功的請求中獲得許多可能的狀態代碼 。順便說一句,您可能還想考慮如何處理這些類型的響應,這取決於最終用戶在做什么以及響應是什么。適當。

在您看到任何NSLog語句或其他有關請求完成的通知之前, -uploadFinished:方法通常不應等待數據完全上傳完畢。

因此,要做的一件事是將-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. 
        //
    }
}

對於HTTP客戶端,這是相當常見的行為-它們在完全發送了請求(包括附件)之前,不會嘗試從服務器讀取答復。

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

我能想到的唯一其他選擇是,如果您控制服務器,則轉為使用基於cookie的身份驗證,或者在自定義http標頭中使用身份驗證。 但是我認為我建議先執行GET請求可能是最好的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM