如何使用.NET HttpWebRequest API从响应中读取HTTP头?

9

我的应用目前使用OAuth与Twitter API进行通信。去年12月,Twitter将OAuth的速率限制提高到每小时350个请求。然而,我没有看到这一点。我仍然从account/rate_limit_status方法中获得150。

有人告诉我需要使用X-RateLimit-Limit HTTP头来获取新的速率限制。然而,在我的代码中,我没有看到该标头。

以下是我的代码...

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(newURL);
request.Method = "GET";
request.ServicePoint.Expect100Continue = false;
request.ContentType = "application/x-www-form-urlencoded";

using (WebResponse response = request.GetResponse())
{
    using (StreamReader reader = new StreamReader(response.GetResponseStream()))
    {
        responseString = reader.ReadToEnd();
    }
}

如果我检查response,我可以看到它有一个Headers属性,而且有16个头。然而,列表中没有X-RateLimit-LimitImage
(来源:yfrog.com 有什么想法我做错了吗?

我对Twitter API一无所知,但是X-RateLimit-Limit头应该在请求中使用,而不是通过响应接收吗? - nothrow
@Yossarian,不是的;应该在响应中:http://apiwiki.twitter.com/Rate-limiting - Craig Stuntz
@Yossarian - request 只有两个头部:Content-Type 和 Host。而它们是 RequestHeaders。X-RateLimit-Limit 来自 Twitter,所以我会认为它应该在响应中。 - Ryan Alford
2个回答

12

你应该能够简单地使用:

using (WebResponse response = request.GetResponse())
{
  string limit = response.Headers["X-RateLimit-Limit"];
  ...
}

如果那不像预期的那样工作,你可以在response.Headers上进行watch并查看其中的内容。


如果响应不是“200 OK”,则它无法正常工作。如果服务器返回“550内部服务器错误”或“404未找到”,应用程序将在“GetResponse”上抛出异常并中断。 - Adrian Preuss

2
查看原始响应文本(例如使用Fiddler)。如果响应头不在那里,任何C#代码都无法让它出现。 :) 根据您所展示的内容,似乎响应中没有该头部信息。
更新:当我访问:http://twitter.com/account/rate_limit_status.xml时,没有X-RateLimit-Limit头部信息。但是当我访问http://twitter.com/statuses/public_timeline.xml时,有该头部信息。因此,我认为您只需要使用不同的方法。
尽管如此,它仍然显示150!

2
谢谢,Craig。问题在于 rate_limit_status 没有被限制。我使用的方法也没有被限制 (即 access_token OAuth 方法)。如果我使用一个被限制的方法,比如 public_timeline,它就会出现。所以看起来 Twitter 只会为实际上被限制了的方法发送这些头部值。 - Ryan Alford

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接