получить HTML-содержимое страницы с помощью Silverlight - PullRequest
5 голосов
/ 03 мая 2010

Я пытаюсь получить html-содержимое страницы, используя silverlight. Классы веб-ответов и запросов не работают в 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 Во время операции возникла исключительная ситуация, делающая результат недействительным. Проверьте InnerException для подробностей исключения. в System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNeeded () в System.Net.DownloadStringCompletedEventArgs.get_Result () в JWTG.MainPage.ClientDownloadStringCompleted (Отправитель объекта, DownloadStringCompletedEventArgs e) в System.Net.WebClient.OnDownloadStringCompleted (DownloadStringCompletedEventArgs e) в System.Net.WebClient.DownloadStringOperationCompleted (Object arg)

Я пробовал множество вещей, но все не удалось.

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

Заранее спасибо!

Ответы [ 4 ]

1 голос
/ 08 октября 2011

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

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;

    }
1 голос
/ 03 мая 2010

Попробуйте это вместо ваших 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;
    }
}

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

1 голос
/ 10 мая 2010

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

"Если запрос на подключение поступил от веб-клиента или класса HTTP к междоменному сайту, среда выполнения Silverlight пытается загрузить файл политики безопасности с использованием протокола HTTP. Сначала среда выполнения Silverlight пытается загрузить файл политики Silverlight с помощью имя «clientaccesspolicy.xml» в корне запрошенного целевого домена с использованием протокола HTTP.

Если файл «clientaccesspolicy.xml» либо не найден (веб-запрос возвращает код состояния 404), либо возвращается с неожиданным типом mime, либо недопустимым XML, либо имеет недопустимый корневой узел, тогда среда выполнения Silverlight выполните запрос для файла политики Flash с именем «crossdomain.xml» в корне запрошенного целевого домена, используя протокол HTTP.

HTTP-перенаправления для файла политики не разрешены. Перенаправление для файла политики приведет к тому, что SecurityException запретит доступ. "

0 голосов
/ 03 мая 2010

В этой строке

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

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

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

...