2011-11-27 79 views
4

我正在使用谷歌應用引擎的urlfetch功能來遠程登錄到其他網絡服務。一切工作都很好,但是當我轉到生產時,登錄過程失敗。您對如何調試生產URL獲取有任何建議嗎?Google App引擎網址抓取不適用於生產

我在我的URL獲取中使用cookie和其他標題(我手動設置標頭中的cookie)。其中一個cookie是會話cookie。

沒有錯誤或異常。在生產中,向URL命令發佈登錄會返回會話cookie,但當您使用會話cookie請求頁面時,它們將被忽略,並且系統會再次提示您輸入登錄信息。開發一旦你獲得會話cookie,你可以訪問內部頁面就好。我認爲問題與保存cookie有關,但由於請求幾乎完全相同,所以它們看起來是正確的。

這是我怎麼稱呼它:

fetchresp = urlfetch.fetch(url=req.get_full_url(), 
    payload=req.get_data(), 
    method=method, 
    headers=all_headers, 
    allow_truncated=False, 
    follow_redirects=False, 
    deadline=10 
    ) 

這裏有一些猜測的問題:

  • 谷歌的網址的分佈式特性獲取實現搞亂的東西了。
  • 在生產時,標題的發送順序與開發順序不同,也許令服務器感到困惑。
  • 谷歌的一些服務器被目標服務器列入黑名單。

下面是一些假設,我已經排除了:

  • 谷歌緩存是過於激進。但是,在使用頭緩存控制:無存儲關閉緩存後,我仍然遇到問題。
  • Google的urlfetch對目標服務器來說太快了。但在通話之間插入延遲後,我仍然遇到問題。
  • Google將一些數據附加到User-Agent標題。但是我已經將這個標題添加到了開發中,而我沒有遇到問題。

生產URL獲取和開發URL獲取之間還有什麼其他區別?你有任何想法來調試嗎?

更新2

(首先更新上面合併) 我不知道這是否是我做的事(或許將延遲或禁止上述緩存),但現在的生產環境中工作的大約50%的時間。這絕對看起來像一個競爭條件。不幸的是,我不知道問題出在我的代碼,谷歌代碼還是目標服務器的代碼中。

+0

除了「不工作」之外,您還未提供任何其他詳細信息 - 運行此代碼時會發生什麼情況?您是否嘗試將它指向您控制的站點,以便您可以記錄收到的請求? –

+0

好主意。我試着將它指向一個控制站點,並且我已經區分了兩個請求對象。它們幾乎完全相同。也許谷歌的IP被列入黑名單,我不確定。 – speedplane

+0

您仍然沒有解釋在這種情況下「不起作用」的含義。 –

回答

1

檢查您的服務器的日誌,看看GAE是否切斷任何頭。我注意到GAE(以爲我認爲我已經在開發服務器上看到過它)會切斷它不喜歡的頭文件。

根據您打電話的網絡服務,GAE調用它比使用本地機器可能還要少。

2

正如其他人所提到的,dev和prod之間的主要區別在於始發IP,以及如何處理一些請求標頭。有關限制標題的列表,請參閱here。我不知道這是否有記錄,但在prod中,您的應用程序ID被附加到您的用戶代理的末尾。我曾經遇到過問題,因爲我的應用程序ID中包含字符串「bot」,因此只能將prod中的請求檢測爲搜索引擎蜘蛛。

您提到您正在手動設置Cookie,包括會話Cookie。這是否意味着你在Dev中建立了一個會話,然後你試圖在產品中重新使用它?遠程服務器是否可能記錄建立會話的源IP,並要求後續請求來自同一個IP?

你說這不起作用,但你沒有得到一個例外。這到底是什麼意思?你得到一個HTTP 200和一個空的響應體?另一個HTTP狀態?您最好的選擇可能是聯繫遠程服務的所有者,看看他們是否可以更具體地告訴您您的請求出了什麼問題。其他任何只是猜測。

+0

感謝您的所有建議。 (1)我看到了你提到的同樣的東西,應用程序ID被附加到用戶代理。我不知道這是否導致了問題,我不確定。 (2)我不想在開發和產品中重複使用會話。 (3)我將在純django安裝上嘗試同樣的事情,看看它是如何發展的。 – speedplane

1

我在遇到類似問題的webapp時遇到了這個問題 - 在查看urlfetch's documentation時發現,獲取調用的最大超時時間爲60秒,但默認爲5秒。

我的本地計算機上5秒鐘的時間足以請求本地計算機上的URL,但在GAE上,只有20%的時間在5秒內完成其任務。

我包含了參數deadline=60,它一直工作正常。

希望這可以幫助別人!