c# - 如何使用 .NET Core 代理一个完整的网站?

标签 c# .net-core

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

简化的形式是这样的:

[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 中的图像和其他内容,因为它们无法解析内部相对 URL。

在困惑中,我尝试使用 Referer 等属性和 Host在请求和响应中,但没有取得任何进展。


在需要的地方。我们需要通过 IFRAME 使用第三方网站,而该网站需要 Authorization header 存在,所以上面的代理应该这样做,然后返回网站,所以可以直接使用 API 链接,如下所示:<iframe src="https://localhost:44307/api/test"> - 这个例子应该呈现完整 google.com iframe 内的网站,但它仅呈现 HTML。

最佳答案

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

  1. 您可以将他们对内部资源的所有引用替换为指向您的代理的链接,以便为每个资源添加 header 。

  2. 您可以将它们的所有相对路径替换为原始域的绝对路径,以便所有资源请求绕过您的代理。根据它们的安全性,可能会出现一些问题。

正如一些人所提到的,这两种解决方案都不会使拥有强大的解决方案变得容易,并且还需要解析 CSS 和 JavaScript 以及相对路径。不幸的是,这并不是一项简单的任务,但可能比尝试使用某种虚拟化要容易得多。

要替换内容,您可以使用类似 HTMLAgilityPack 的内容.我已经在几个项目中使用过它,效果很好,并且有一个很好的社区。

这位先生发布了一个如何做非常相似的事情的例子HERE .

关于c# - 如何使用 .NET Core 代理一个完整的网站?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54696258/

相关文章:

c# - 如何使用 ILoggerBuilder 的扩展方法而不是 ILoggerFactory?

c# - Entity Framework 核心: Unable to catch SqlException

c# - 不显示 .net 对象的属性和方法

C# '(class) var' - 这是什么结构

c# - 为什么添加 DoubleStructs 比添加 double 慢得多?

visual-studio - 在使用独立应用程序之前,是否必须在系统上安装 .net core?

c# - 遍历一天中的几个小时

c# - WPF 绑定(bind)警告

C# ILogger依赖注入(inject)错误: There is no argument

.net-core - 如何将 .NET Core 2.0 xUnit 测试报告导入 VSTS