0

我正在尝试使用以下 url 访问 REST Disqus API:

http://disqus.com/api/3.0/threads/listPosts.json
?api_key=myKey
&forum=myForum
&thread:ident=myIdent

当我转到 Chrome 中的 url 时,它工作正常。当我尝试在 中下载它时WebClient,我遇到了困难:

            WebClient data = new WebClient();
            Uri queryUri = new Uri(DisqusQuery + ident, UriKind.Absolute);
            data.DownloadStringCompleted += new DownloadStringCompletedEventHandler(onDownloadCompleted);
            data.DownloadStringAsync(queryUri);

包含以下DownloadStringCompletedEventArgs错误:

{"The remote server returned an error: NotFound."}
 at System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult)
   at System.Net.Browser.ClientHttpWebRequest.<>c__DisplayClass2.<EndGetResponse>b__1(Object sendState)
   at System.Net.Browser.AsyncHelper.<>c__DisplayClass4.<BeginOnUI>b__1(Object sendState)
   at System.Reflection.RuntimeMethodInfo.InternalInvoke(RuntimeMethoThe thread '<No Name>' (0xfc10086) has exited with code 0 (0x0).

我可能做错了什么?

更新:查看 Fiddler 显示响应是这样的:

HTTP/1.1 400 BAD REQUEST
Date: Sun, 28 Aug 2011 14:51:39 GMT
Server: Apache/2.2.14 (Ubuntu)
Vary: Cookie,Accept-Encoding
p3p: CP="DSP IDC CUR ADM DELi STP NAV COM UNI INT PHY DEM"
Content-Length: 68
Connection: close
Content-Type: application/json
X-Pad: avoid browser bug

{"code": 11, "response": "Your API key is not valid on this domain"}

以下是请求来自 Chrome Incognito(未登录到 disqus)时的响应:

HTTP/1.1 200 OK
Date: Mon, 29 Aug 2011 17:00:29 GMT
Server: Apache/2.2.14 (Ubuntu)
X-Ratelimit-Remaining: 1000
Content-Encoding: gzip
Vary: Cookie,Accept-Encoding
X-Ratelimit-Limit: 1000
p3p: CP="DSP IDC CUR ADM DELi STP NAV COM UNI INT PHY DEM"
X-Ratelimit-Reset: 1314640800
Content-Length: 3120
Connection: close
Content-Type: application/json

/* expected JSON response */

更新 2:上述错误是使用我的公钥。使用密钥会导致:

HTTP/1.1 403 FORBIDDEN
Date: Sun, 28 Aug 2011 20:40:32 GMT
Server: Apache/2.2.14 (Ubuntu)
Vary: Cookie,Accept-Encoding
p3p: CP="DSP IDC CUR ADM DELi STP NAV COM UNI INT PHY DEM"
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json

2a
{"code": 5, "response": "Invalid API key"}
0
4

2 回答 2

1

使固定:

在 HttpRequest 中添加类似于以下行的内容:

client.Headers[HttpRequestHeader.Referer] = "http://mywebsite.com";

更长的描述:

问题与 Windows Phone 设置 HTTP Referer 标头的方式有关。

当从浏览器地址栏运行成功的请求时,Fiddler 向我展示了这个:

GET /api/3.0/forums/listPosts.json?forum=disqus&api_key=jRml... HTTP/1.1
Accept: */*
Accept-Language: en-US
Accept-Encoding: gzip, deflate, peerdist
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; Zune 4.7; InfoPath.3; MS-RTC LM 8)
Connection: Keep-Alive
Host: disqus.com
Cookie: disqus_unique=...
X-P2P-PeerDist: Version=1.0

当我在 Fiddler 中检查 Silverlight 发送的请求时,我看到了以下内容:

GET /api/3.0/forums/listPosts.json?forum=disqus&api_key=jRml... HTTP/1.1
Accept: */*
Referer: file:///Applications/Install/9036AAF3-F213-4CFB-B57E-576A05E1896D/Install/
Accept-Encoding: identity
User-Agent: NativeHost
Host: disqus.com
Connection: Keep-Alive

通过删除 Referer 标头并通过 Fiddler 重新提交,查询按预期工作!所以......您需要做的就是手动将 HTTP Referer 标头设置为您可以控制的内容(而不是让 Silverlight 为您完成),您应该一切顺利。

哦-还要确保您使用的是公钥,而不是密钥。

/ck

于 2011-09-02T19:51:48.897 回答
0

看起来浏览器正在获取其他信息,例如用户名或其他信息:X-User: anon:182210122933。当 WebClient 得到它的响应时,这是缺失的。我想这与您在浏览器中登录或您的 api 密钥中有错字有关。

另一个有趣的指向项目是http://disqussharp.codeplex.com/之类的库,它大部分时间都在处理身份验证。

祝你好运!

于 2011-08-28T20:37:52.670 回答