如何使用.NET Core代理完整的网站?

时间:2019-02-14 17:44:46

标签: c# .net-core

我正在尝试在.NET Core REST服务中实现一个简单的代理,因此我可以注入其他身份验证标头,然后将其返回给任何客户端(如普通网站)。

简化形式如下:

[HttpGet]
public async Task<ContentResult> Get()
{
    HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://google.com");

    /* some extra headers injection happens here */

    var response = await client.SendAsync(request);
    response.EnsureSuccessStatusCode();
    var result = await response.Content.ReadAsStringAsync();
    return Content(result, "text/html", Encoding.UTF8);
}

问题是,尽管任何浏览器都将响应正确地呈现为原始HTML页面,但是返回页面中包含的任何scriptlink(任何相对URL)都将失败。

上面的代码中缺少什么来使浏览器正确解析内部相对URL?

在上面的示例中,如果运行它,则会从google.com中显示https://localhost:44307/api/test页面,但相对URL-s中的图像和其他内容丢失了,因为它们无法解析内部相对网址。

在混乱中,我尝试在请求和响应中使用RefererHost之类的属性,但是没有取得任何进展。


在需要的地方。我们需要通过IFRAME使用第三方网站,并且该网站要求提供Authorization标头,因此上述代理应该这样做,然后返回该网站,因此可以直接使用API​​链接,像这样:<iframe src="https://localhost:44307/api/test">-此示例应在iframe中呈现完整的google.com网站,但仅呈现HTML。

1 个答案:

答案 0 :(得分:0)

大量的网站使用相对路径来获取其资源(脚本/链接/图像/等),因为它很方便并且允许它们在不同的环境中工作。例如,拥有开发服务器,登台服务器和生产服务器要求每个服务器都能够加载适当的内容。话虽这么说,您有几个选择,但是它们将要求您解析那里的内容:

  1. 您可以使用代理链接替换其对内部源的所有引用,以便为每种资源添加标题。

  2. 您可以将其所有相对路径替换为原始域的绝对路径,以便所有资源请求都绕过您的代理。取决于其安全性,可以解决一些问题。

正如某些人所提到的,这两种解决方案都不会使拥有健壮的解决方案变得容易,并且还需要解析CSS和JavaScript以获取相对路径。不幸的是,这并不是一件容易的事,但可能比尝试使用某种类型的虚拟化要容易得多。

要替换内容,可以使用HTMLAgilityPack之类的内容。我已经在一些项目中使用了它,并且效果很好,并且拥有一个相当不错的社区。

这位绅士发布了一个如何做类似HERE的事情的例子。