Я пытаюсь получить доступ к REST Disqus API, используя следующий URL-адрес:
http://disqus.com/api/3.0/threads/listPosts.json
?api_key=myKey
&forum=myForum
&thread:ident=myIdent
Когда я перехожу по URL-адресу в Chrome, он работает нормально. Когда я пытаюсь загрузить его в 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
2 ответа
ИСПРАВЛЕНИЕ:
Добавьте в свой 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
Когда я изучил запрос, отправленный Silverlight в Fiddler, я увидел следующее:
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
Похоже, браузер получает дополнительную информацию, например имя пользователя или что-то в этом роде: X-User: anon: 182210122933. Это отсутствует, когда WebClient получает ответ. Я думаю, это как-то связано с тем, что вы вошли в систему в браузере или что у вас есть опечатка в вашем API-ключе.
Еще один интересный проект для вас - это такая библиотека, как http://disqussharp.codeplex.com/, которая больше всего обрабатывает аутентификацию. времени.
Удачи!
Похожие вопросы
Связанные вопросы
Новые вопросы
silverlight
Silverlight - кросс-браузерный, кроссплатформенный плагин Microsoft для работы со СМИ и многофункциональных интерактивных приложений.