2011-11-27 78 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,它一直工作正常。

希望这可以帮助别人!