2010-05-03 2 views
5

Я пытаюсь получить html-содержимое страницы с помощью silverlight. Классы Webresponse и request не работают в silverlight.Получить html-содержимое страницы с Silverlight

Я сделал несколько поисковых запросов, и я нашел что-то. Это то, что я пробовал:

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 Application Исключение во время операции, что делает результат недействительным. Проверьте значение InnerException для получения сведений об исключении. на System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary() в System.Net.DownloadStringCompletedEventArgs.get_Result() в JWTG.MainPage.ClientDownloadStringCompleted (Object отправителя, DownloadStringCompletedEventArgs е) в System.Net.WebClient.OnDownloadStringCompleted (DownloadStringCompletedEventArgs е) на System.Net.WebClient.DownloadStringOperationCompleted (Object arg)

Я пробовал много вещей, но все провалилось.

Что мне не хватает? Или кто-нибудь знает, как я мог бы достичь этого по-другому?

Заранее благодарен!

+0

Вы получаете ошибку JScript. Ваш опубликованный код не имеет ничего общего с ошибкой. Я просто попробовал ваш фрагмент, и он работает. BTW: вам нужно переместить этот 'this.txbSummery.Text = this.result;' в свой метод 'ClientDownloadStringCompleted'. В настоящее время вы пытаетесь поместить текст в текстовое поле до его загрузки. Это явно не работает. –

+0

Посмотрите: http://forums.silverlight.net/forums/t/54721.aspx, возможно, это поможет вам. Проблема может быть неправильно сконфигурированным файлом 'web.config'. –

ответ

1

Это связано с clientaccesspolicy.xml. Подробнее здесь: http://msdn.microsoft.com/en-us/library/cc645032(VS.95).aspx

"If the connection request was from a WebClient or an HTTP class to a cross-domain site, the Silverlight runtime tries to download the security policy file using the HTTP protocol. The Silverlight runtime first tries to download a Silverlight policy file with a name of "clientaccesspolicy.xml" at the root of the requested target domain using the HTTP protocol.

If the "clientaccesspolicy.xml" is either not found (the web request returns a 404 status code), returned with an unexpected mime-type, is not valid XML, or has an invalid root node, then the Silverlight runtime will issue a request for a for the Flash policy file with a name of "crossdomain.xml" at the root of the requested target domain, using the HTTP protocol.

HTTP redirects for the policy file are not allowed. A redirect for a policy file will result in a SecurityException of access denied."

+0

Hi, Я понял. Веб-сайт, на котором я пытался получить доступ с помощью silverlight, не имеет файла политики. Спасибо, в любом случае! – Yustme

0

В этой строке

this.client.DownloadStringAsync(new Uri(url, UriKind.Absolute)); 

вы заявляете в asynchroneous загрузку в фоновом потоке. И в следующей строке вы как-то ожидаете, что это завершено?

Если вы ничего не знаете о Threading, попробуйте сначала загрузить DownloadString. Тогда ваш код будет работать.

+0

Привет, Я попытался поместить эту «следующую строку» в обратный вызов загрузки, но это не устранило ошибку времени выполнения. Где я могу найти эту «downloadstring»? К какому классу он принадлежит? – Yustme

+0

@ Foxfire: вы действительно не хотите делать блокирующий вызов для извлечения веб-страницы, не так ли? Yustme должен просто использовать «DownloadStringAsync», но поместить логику обработки возвращенных данных в метод «ClientDownloadStringCompleted». –

+0

@Yustme: Вы не можете поместить вещь впоследствии в событие либо потому, что она будет вызвана из другого потока. – Foxfire

1

Попробуйте этот вариант, а не ваш btn1_Click и ClientDownloadStringCompleted методов. Он вызывает поток GUI после загрузки фида для обновления текстового поля. Если он не удается из-за ошибки в сети, он распакует исключение (содержащееся как внутреннее исключение в 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; 
    } 
} 

Если ошибка снова встречается, (я думаю, что это произойдет), пожалуйста, напишите сообщение StackTrace и ошибки здесь.

+0

Привет, Как-то я просмотрел эту должность: о Это то, что я получаю:. певд Error ("Неизвестное об ошибке в Silverlight Application Исключение во время операции, что делает результат недопустимый Проверьте InnerException подробности исключения. в System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary() \ n в System.Net.DownloadStringCompletedEventArgs.get_Result() \ n в JWTG.MainPage. <> c__DisplayClass2. b__0() "); нет stacktrace – Yustme

+0

Черт, это снова в коробке в исключение. Так вы могли бы, например, взглянуть на внутреннее исключение? Либо используйте отладчик, либо просто замените 'throw tiex.InnerException;' на 'throw tiex.InnerException.InnerException;' –

+0

Он никогда не заходит так далеко, он останавливается в Dispatcher.BeginInvoke (() => this.txbSummery.Text = e .Result ?? ""); но см. мой пост по этому поводу для дополнительной информации – Yustme

1

Вы попробуйте

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)); 

    } 

    private void ClientDownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
    { 
     Stream s = e.Result; 
     StreamReader strReader = new StreamReader(s); 
     string webContent = strReader.ReadToEnd(); 
     s.Close(); 
     this.txbSummery.Text =webContent; 

    } 
Смежные вопросы