Я пытаюсь получить содержимое HTML страницы с помощью Silverlight. Webresponse и классы запроса не работают в Silverlight.
Я сделал некоторый поиск с помощью Google, и я нашел что-то. Это - то, что я попробовал:
public partial class MainPage : UserControl
{
string result;
WebClient client;
public MainPage()
{
InitializeComponent();
this.result = string.Empty;
this.client = new WebClient();
this.client.DownloadStringCompleted += ClientDownloadStringCompleted;
}
private void btn1_Click(object sender, RoutedEventArgs e)
{
string url = "http://www.nu.nl/feeds/rss/algemeen.rss";
this.client.DownloadStringAsync(new Uri(url, UriKind.Absolute));
if (this.result != string.Empty && this.result != null)
{
this.txbSummery.Text = this.result;
}
}
private void ClientDownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
this.result = e.Result;
//handle the response.
}
}
Это дает мне ошибку периода выполнения после нажатия кнопки:
Ошибка периода выполнения Microsoft JScript: необработанная Ошибка в Приложении Silverlight исключение произошла во время операции, делая результат недопустимым. Проверьте InnerException на детали исключения. в System. ComponentModel. AsyncCompletedEventArgs. RaiseExceptionIfNecessary () в Системе. Сеть. DownloadStringCompletedEventArgs.get_Result () в JWTG.MainPage. ClientDownloadStringCompleted (Объектный отправитель, DownloadStringCompletedEventArgs e) в System. Сеть. WebClient. OnDownloadStringCompleted (DownloadStringCompletedEventArgs e) в Системе. Сеть. WebClient. DownloadStringOperationCompleted (Объектный аргумент)
Я попробовал многочисленные вещи, но все отказавшие.
Что я пропускаю? Или кто-либо знает, как я мог достигнуть этого по-другому?
Заранее спасибо!
Это связано с clientaccesspolicy.xml. Подробнее читайте здесь: http://msdn.microsoft.com/en-us/library/cc645032(VS.95).aspx
"Если запрос на подключение был от WebClient или класса HTTP к междоменному сайту, среда выполнения Silverlight пытается загрузить файл политики безопасности, используя протокол HTTP. Среда выполнения Silverlight сначала пытается загрузить файл политики Silverlight с именем "clientaccesspolicy.xml" в корне запрошенного целевого домена с помощью протокола HTTP.
Если файл "clientaccesspolicy.xml" не найден (веб-запрос возвращает код состояния 404), возвращается с неожиданным mime-типом, не является действительным XML или имеет недопустимый корневой узел, то среда выполнения Silverlight выдает запрос на файл политики Flash с именем "crossdomain.xml" в корне запрашиваемого целевого домена, используя протокол HTTP.
HTTP-перенаправления для файла политики не допускаются. Перенаправление для файла политики приведет к возникновению SecurityException "Доступ запрещен."
Попробуйте этот вместо методов btn1_Click
и ClientDownloadStringCompleted
. Он вызывает поток графического интерфейса после загрузки канала для обновления текстового поля. Если он не работает из-за ошибки в сети, он распаковывает исключение (содержащееся как внутреннее исключение в TargetInvocationException
) и повторно генерирует внутреннее исключение.
private void btn1_Click(object sender, RoutedEventArgs e)
{
string url = "http://www.nu.nl/feeds/rss/algemeen.rss";
this.client.DownloadStringAsync(new Uri(url));
}
private void ClientDownloadStringCompleted(object sender,
DownloadStringCompletedEventArgs e)
{
try
{
Dispatcher.BeginInvoke(() => this.txbSummery.Text = e.Result ?? "");
}
catch (TargetInvocationException tiex)
{
throw tiex.InnerException;
}
}
Если ошибка повторится снова (я предполагаю, что это произойдет), опубликуйте трассировку стека и сообщение об ошибке здесь.
В этой строке
this.client.DownloadStringAsync(new Uri(url, UriKind.Absolute));
вы указываете асинхронную загрузку в фоновом потоке. А в следующей строке вы каким-то образом ожидаете, что она полностью завершена?
Если вы ничего не знаете о Threading, просто попробуйте сначала с помощью DownloadString. Тогда ваш код будет работать.