Я пытаюсь получить доступ к 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
0
Nick Heiner 27 Авг 2011 в 23:12

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

1
Chris Koenig 2 Сен 2011 в 19:51

Похоже, браузер получает дополнительную информацию, например имя пользователя или что-то в этом роде: X-User: anon: 182210122933. Это отсутствует, когда WebClient получает ответ. Я думаю, это как-то связано с тем, что вы вошли в систему в браузере или что у вас есть опечатка в вашем API-ключе.

Еще один интересный проект для вас - это такая библиотека, как http://disqussharp.codeplex.com/, которая больше всего обрабатывает аутентификацию. времени.

Удачи!

0
JLaanstra 28 Авг 2011 в 20:37