【问题标题】:get html content of a page with Silverlight使用 Silverlight 获取页面的 html 内容
【发布时间】:2011-10-08 12:16:40
【问题描述】:

我正在尝试使用 silverlight 获取页面的 html 内容。 Webresponse 和 request 类在 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.RaiseExceptionIfNecessary() 在 System.Net.DownloadStringCompletedEventArgs.get_Result() 在 JWTG.MainPage.ClientDownloadStringCompleted(对象发送者,Dow​​nloadStringCompletedEventArgs e) 在 System.Net.WebClient.OnDownloadStringCompleted(DownloadStringCompletedEventArgs e) 在 System.Net.WebClient.DownloadStringOperationCompleted(Object arg)

我尝试了很多事情,但都失败了。

我错过了什么?或者有谁知道我如何以不同的方式实现这一目标?

提前致谢!

【问题讨论】:

  • 您遇到了 JScript 错误。您发布的代码与错误无关。我刚试过你的sn-p,它可以工作。顺便说一句:您必须将 this.txbSummery.Text = this.result; 移动到您的 ClientDownloadStringCompleted 方法中。目前,您正试图在下载文本之前将其放入文本框中。这显然行不通。
  • 看看:forums.silverlight.net/forums/t/54721.aspx 也许对你有帮助。问题可能是配置错误的web.config 文件。

标签: c# html silverlight runtime


【解决方案1】:

这与clientaccesspolicy.xml 有关。在这里阅读更多: http://msdn.microsoft.com/en-us/library/cc645032(VS.95).aspx

“如果连接请求是从 WebClient 或 HTTP 类到跨域站点的,Silverlight 运行时会尝试使用 HTTP 协议下载安全策略文件。Silverlight 运行时首先会尝试使用以下命令下载 Silverlight 策略文件使用 HTTP 协议在请求的目标域的根目录中的名称“clientaccesspolicy.xml”。

如果未找到“clientaccesspolicy.xml”(Web 请求返回 404 状态代码)、返回意外的 mime 类型、不是有效的 XML 或具有无效的根节点,则 Silverlight 运行时将使用 HTTP 协议在所请求的目标域的根目录发出一个名为“crossdomain.xml”的 Flash 策略文件的请求。

不允许对策略文件进行 HTTP 重定向。策略文件的重定向将导致访问被拒绝的 SecurityException。”

【讨论】:

  • 嗨,我想通了。我尝试使用 silverlight 访问的网站没有策略文件。还是谢谢!
【解决方案2】:

试试这个,而不是你的 btn1_ClickClientDownloadStringCompleted 方法。它在下载提要后调用 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;
    }
}

如果错误再次发生(我猜会发生),请在此处发布堆栈跟踪和错误消息。

【讨论】:

  • 嗨,不知何故我忽略了这篇文章:o 这就是我得到的: throw new Error("Unhandled Error in Silverlight Application An exception occurred during the operation, making the result invalid. Check InnerException for exception details . 在 System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary()\n 在 System.Net.DownloadStringCompletedEventArgs.get_Result()\n 在 JWTG.MainPage.c__DisplayClass2.b__0()");没有堆栈跟踪
  • 该死的再次被装箱在一个例外中。那么你能不能看一下 innerException 呢?要么使用调试器,要么将throw tiex.InnerException; 替换为throw tiex.InnerException.InnerException;
  • 它永远不会走那么远,它停在 Dispatcher.BeginInvoke(() => this.txbSummery.Text = e.Result ?? "");但请参阅我在此下的帖子以获取更多信息
【解决方案3】:

你试试

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;

    }

【讨论】:

    【解决方案4】:

    在这一行

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

    您在后台线程中声明异步下载。在下一行中,您以某种方式期望它已经完成?

    如果您对线程一无所知,请先尝试使用 DownloadString。然后你的代码就可以工作了。

    【讨论】:

    • 嗨,我尝试将“下一行”放在下载回调中,但这并没有解决运行时错误。我在哪里可以找到这个“下载字符串”?它属于哪个类?
    • @Foxfire:你真的不想通过阻塞调用来检索网页,是吗? Yustme应该只使用DownloadStringAsync,但是将处理返回数据的逻辑放到ClientDownloadStringCompleted方法中。
    • @Yustme:你也不能把这个东西放到事件中,因为它会被另一个线程调用。
    • @Philip:是的,我想要那个 - 至少在他解决错误之前。而且他不能只是把他当前的逻辑放在那里,因为 this.txbSummery 作为事件调用在另一个线程上运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多