4

我正在使用谷歌应用引擎的 urlfetch 功能远程登录另一个网络服务。在开发中一切正常,但是当我转向生产时,登录过程失败。您对如何调试生产 URL 获取有任何建议吗?

我在我的 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 的 url fetch 实现的分布式特性把事情搞砸了。
  • 在生产中,标头的发送顺序与开发中不同,这可能会使服务器感到困惑。
  • 谷歌的一些服务器被目标服务器列入黑名单。

以下是我排除的一些假设:

  • 谷歌缓存太激进了。但是在使用标头 Cache-Control: no-store 关闭缓存后我仍然遇到问题。
  • Google 的 urlfetch 对目标服务器来说太快了。但是在通话之间插入延迟后我仍然遇到问题。
  • Google 将一些数据附加到 User-Agent 标头。但是我已将该标题添加到开发中,但我没有遇到问题。

生产 URL 获取和开发 URL 获取之间还有哪些其他区别?你有什么调试这个的想法吗?

更新 2

(第一次更新包含在上面)我不知道这是否是我做的事情(可能会添加延迟或禁用上面提到的缓存),但现在生产环境大约有 50% 的时间工作。这绝对看起来像一个竞争条件。不幸的是,我不知道问题出在我的代码、google 的代码还是目标服务器的代码中。

4

3 回答 3

2

正如其他人所提到的,dev 和 prod 之间的主要区别在于原始 IP,以及如何处理一些请求标头。有关受限标头的列表,请参见此处。我不知道这是否记录在案,但在 prod 中,您的应用 ID 会附加到用户代理的末尾。我曾经遇到过一个问题,即仅 prod 中的请求被检测为搜索引擎蜘蛛,因为我的应用 ID 包含字符串“bot”。

您提到您正在手动设置 cookie,包括会话 cookie。这是否意味着您在 Dev 中建立了一个会话,然后您试图在 prod 中重用它?远程服务器是否可能正在记录建立会话的源 IP,并要求后续请求来自同一 IP?

你说它不起作用,但你没有得到例外。这到底是什么意思?你得到一个 HTTP 200 和一个空的响应体?另一个 HTTP 状态?您最好的选择可能是联系远程服务的所有者,看看他们是否可以更具体地告诉您您的请求出了什么问题。其他一切都只是猜测。

于 2011-11-28T15:58:03.820 回答
1

检查您的服务器的日志以查看 GAE 是否正在切断任何标头。我注意到 GAE(我想我已经在开发服务器上看到过它)会砍掉它不喜欢的标题。

根据您调用的 Web 服务,GAE 调用它也可能不如您的本地机器好。

于 2011-11-28T04:11:05.410 回答
1

我在制作一个有类似问题的 webapp 时遇到了这个问题——在查看urlfetch 的文档时,结果表明 fetch 调用的最大超时时间为 60 秒,但默认为 5 秒。

我的本地机器上的 5 秒足以在我的本地机器上请求 URL,但在 GAE 上,它只有大约 20% 的时间在 5 秒内始终如一地完成其任务。

我包含了参数deadline=60,从那以后它一直运行良好。

希望这对其他人有帮助!

于 2012-10-04T01:18:33.833 回答