Загрузка веб-страниц в WinRT вызывает исключение
Я использую этот код для загрузки веб-страницы в приложении Metro Style:
public static async Task<string> DownloadPageAsync(string url)
{
HttpClientHandler handler = new HttpClientHandler();
handler.UseDefaultCredentials = true;
handler.AllowAutoRedirect = true;
HttpClient client = new HttpClient(handler);
HttpResponseMessage response = await client.GetAsync(url);
response.EnsureSuccessStatusCode();
string responseBody = response.Content.ReadAsString();
return responseBody;
}
проблема заключается в том, что при выполнении строки client.GetAsync(url)
она выдает исключение, в котором говорится:
An error occurred while sending the request.
От типа: HttpRequestException
.
EDIT:
Я использовал InnerException для получения дополнительной информации. Первое исключение - SocketException
с сообщением ниже:
An attempt was made to access a socket in a way forbidden by its access permissions
at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
at System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar)
ИЗМЕНИТЬ 2:
Я загрузил и запустил образец из Microsoft и получил ту же ошибку:
http://code.msdn.microsoft.com/windowsapps/HttpClient-Upload-Sample-f1abcc4e
ИЗМЕНИТЬ 3:
Я запускал это на другой машине, и он работал нормально. Поэтому я думаю, что нет ничего плохого в коде. Я скопировал это решение, и это означает, что в решении нет ничего плохого. Я пытаюсь переустановить Windows Developer Preview, чтобы узнать, исправляет ли он мою проблему.
Ответы
Ответ 1
OK. Я нашел ответ. Исключение было связано с тем, что я установил продукт NetLimiter в Windows 8 Developer Preview и каким-то образом он помешал моему приложению получить доступ к Интернету.
UPDATE:
Прежде всего, это код, работающий в версии КАЖДЫЙ Windows 8.
public static async Task<string> DownloadPageAsync(string url)
{
try
{
HttpClientHandler handler = new HttpClientHandler { UseDefaultCredentials = true, AllowAutoRedirect = true };
HttpClient client = new HttpClient(handler);
HttpResponseMessage response = await client.GetAsync(url);
response.EnsureSuccessStatusCode();
string html = await response.Content.ReadAsStringAsync();
return html;
}
catch (Exception)
{
return "";
}
}
Во-вторых, если это не работает, скорее всего, у вас есть сетевое программное обеспечение, препятствующее доступу вашего приложения к Интернету. Один популярный случай - прокси-сервер. Если у вас установлен прокси-сервер, ваши приложения MetroStyle не смогут получить доступ к Интернету. Чтобы это сработало, обратитесь к моему блогу по адресу:
http://anoori.me/blog/general/use-proxifier-in-windows-8-without-fiddler2
Ответ 2
довольно уверен, что netlimiter запускал ваш интернет-запрос через прокси-сервер localhost, и ваше приложение не обладало возможностью "локальной сети", которая позволяла бы такой доступ к локальной сети