【问题标题】:Opening an external page inside our page在我们的页面内打开一个外部页面
【发布时间】:2010-08-16 13:16:14
【问题描述】:

我曾经使用 iframe 来实现上面的标题,但现在我不想再使用它了我有一些计划我需要通过在我们的 asp.net 页面中打开一个外部页面来实现它们使用任何 iframe 我只有简单的 aspx 页面,其中包含 div 和面板以及其他一些服务器端组件,我只想知道没有 iframe 怎么办?我不想设计新的复杂控件,但我正在寻找一些方法可以为我做到这一点。

我必须提到,我需要控制由外部站点加载的区域,与 iframe 相同,但不同之处在于 iframe 无法由 ajax 处理,即使您将 iframe 放在更新面板中,您的页面也会刷新和回发,而您正在以编程方式(在 c# 代码中)更改 src 值,所以我们必须设计一些其他方法,解决方案是什么?

我以为我可以请求获取一些 html 并显示到 div 中,但我无法实现它。

【问题讨论】:

  • 旁注/备注(无意侮辱):请仅对您自己的页面或您明确许可的页面执行此操作。否则这可能会被解释为侵犯版权(或类似的东西,除了它不好),你最终会遇到一些麻烦。
  • 请记住,一旦您管理了对 HTML 的检索并将其插入到 div 中,外部内容将受到您网站的 CSS 的影响。而且您必须重写所有非完整的绝对 URL(包括内联 javascript/css)以指向原始服务器。如果没有大量准备,新内容不太可能看起来像原始网站上的任何东西,除非它非常基本,在样式/布局方面没有任何甚至适度“花哨”的东西。使用 iframe,它是您页面中完全独立的文档,无需担心这些问题。
  • 我的主机中没有安全页面,但我的意思是在另一个地方是外部的

标签: c# javascript asp.net ajax asp.net-ajax


【解决方案1】:

你可以

  1. 在服务器端发出 WebRequest,然后将 div 的文本设置为返回的 HTML
  2. 您可以制作一个不可见的 iFrame 来发出请求,然后使用 JavaScript 从 iFrame 中获取 HTML 并将其放入 DIV。 (编辑:评论表明这行不通)

由于跨站点脚本问题,您通常无法调用(如 XmlHttpRequest)到外部网站。

【讨论】:

  • iirc,抓取外部加载的HTML,不是来源于同一个域,无论是否在iframe中,浏览器都不会接受,导致一个空字符串。
  • item 1 你说它很好但是它会降低我的速度和性能我可以像在我的 c# 代码中将 webcontrol 加载到面板或 div 一样加载页面吗?
  • 除非您使用 iframe 或在服务器上发出请求,否则您无法真正绕过跨站点脚本。仅以正常方式使用 iframe 有什么问题 - 这就是它的设计目的。
  • @kamiar3001,请注意:根据您的基础架构,它还可以提高速度和性能,前提是您提供适当的服务器端缓存并拥有充足的带宽和/或大量使用 Sounders 的高性能方法(检查 YSlow)来加速您的网站。
【解决方案2】:

您的直接请求,“在不使用任何 iframe 的情况下在我们的 asp.net 页面中打开外部页面”是不可能的,这在设计上是不可能的。

你提到了 AJAX。您可以使用 AJAX 加载您的页面,删除标题(或在服务器端执行)并将 <body> 标记替换为 <div> 标记(或在服务器端执行)。这样,您可以将页面内容放置在您喜欢的任何位置。作为容器,我建议你使用块级元素,<div> 就足够了。

这里唯一的(!)问题是:浏览器不支持这样的跨站点请求。您可以通过使用WebRequest 或类似方式从其他地方加载页面来解决此服务器端问题。

【讨论】:

    【解决方案3】:

    取决于您要合并数据的位置。如果您想在客户端浏览器上合并数据,除了框架之外,您唯一的选择就是使用 Javascript/Ajax。

    您可以在页面加载时执行 jQuery.ajax() 并在 div 上使用 html() 方法来使用该 AJAX 调用的文本结果填充它.

    尽量少使用 WebForms 控件层次结构和生命周期。如果您不介意页面加载的第二个请求,听起来您的问题可以通过 AJAX 解决。

    如果您想在服务器端合并内容(很少做正确的事情),您可以使用System.Net.HttpWebRequest 获取并合并数据,然后再将其返回到浏览器。

    【讨论】:

      【解决方案4】:

      在您的情况下,iframe 无可替代。出于安全考虑,您将无法向其他站点发出 ajax 请求。您可以检索单个页面服务器端的内容并将其呈现给客户端,但不会包含任何功能,因为内容现在在您自己站点的上下文中运行。

      【讨论】:

      • 你完全错了,因为如果你看过 gmail 网站,你就可以准确地看到我想要的网站
      • @kamiar3001:gmail 使用不同的技术来避免跨站点问题,即:通过相同的域来源加载它。这种方法称为“代理”并且效果很好,但是页面上的某些功能并不总是按您预期的那样工作(甚至在 gmail 上也不行)。
      • 但是你没有提到什么技术可以做什么以及为什么效果很好我如何使用我认为我们可以实现的这些工具来实现
      • @kamiar3001:同意(但我不是这个答案的作者)。这里的每篇文章都提到了该技​​术:服务器端获取 HTML,然后通过 AJAX 方式将其发送到客户端。像雨一样简单而正确,但要设置一些工作,而且要做好更多工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      • 2020-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多