multithreading
  • response.redirect
  • form-submit
  • 2010-04-21 68 views 0 likes 
    0

    我有一個事件需要在執行重定向之前聯繫某些第三方提供商(請考慮'電子商務網站上的最終付款頁面'),因此存在一些與其處理。非常重要的是不要多次聯繫這些第三方提供商,有時不耐煩的用戶可能會嘗試刷新頁面(因此會重新提交數據)。一般的代碼結構是:Response.Redirect由於代碼阻止重新提交而不能觸發

    If Session("orderStatus") <> 'processing' Then 
    
        Session("orderStatus") = 'processing' 
    
        DoThirdPartyStuffThatTakesSomeTime() 
    
        Response.Redirect("confirmationPage.asp", True) 
    
    End If 
    

    問題是,如果用戶刷新頁面,則Response.Redirect的情況不會發生(即使代碼的其餘部分將來自最初提交的重定向之前運行)。看來新的提交爲瀏覽器創建了一個新的線程,它優先 - 它跳過這段代碼顯然是爲了防止第三方提供商第二次聯繫,並且由於沒有重定向,只是返回到同一頁面。整個第二次提交可能在第一次提交完成工作之前完成。

    任何幫助,我仍然可以忽略頁面的所有後續提交,但仍然使重定向工作...?

    感謝

    回答

    1

    您重定向出if結構的變化:

    If Session("orderStatus") <> 'processing' Then 
    
        Session("orderStatus") = 'processing' 
    
        DoThirdPartyStuffThatTakesSomeTime() 
    
    End If 
    
    Response.Redirect("confirmationPage.asp", True) 
    
    +0

    嗨Oded, 謝謝你的回答。不幸的是,重定向只能在第三方內容完成後纔會發生。如果我將其移出,第二次提交會首先觸發並在第三方內容完成之前重定向。 – Marco 2010-04-21 16:59:40

    +0

    然後將它移動到'DoThirdPartyStuffThatTakesSomeTime()'函數的末尾。 – Oded 2010-04-21 17:00:31

    +0

    它已經 - 我的代碼示例只是說明。這更多的是兩個線程以兩種不同的方式同時運行相同的事件(由於會話變量停止代碼運行兩次)。看起來最後一個線程優先於瀏覽器的位置,而我需要首先優先。 – Marco 2010-04-21 17:05:36

    0

    後多一點的研究和調查(包括追蹤和跟蹤什麼被解僱,並使用會話變量時的很多)我發現ASP.NET會自動將給定會話的請求序列化,以便每個會依次執行。然而(這使我感到困惑),傳遞給瀏覽器的'響應'是上一次執行的操作的結果(假設此操作是在瀏覽器收到對前一個操作的響應之前啓動的)。所以,就我而言,在第二個請求開始之前,由第一個請求發起的所有第三方代碼都會結束執行。當所有請求都完成處理後,ASP.NET顯然將HTML的最後一次請求傳遞給IIS(這恰好只是頁面的刷新)。

    因此,Oded的第一個關於移出重定向的建議是正確的 - 我已經標記了這個答案。

    相關問題