修改网站内容并在浏览器中呈现

时间:2018-07-27 03:22:58

标签: c# asp.net-core proxy compression

我正在使用ASP.NET Core 2.0为某些站点编写代理。如果仅将HttpResponseMessage重新转换为浏览器,我的代理就可以正常工作。我基于this示例的代理。但是我需要对网站内容进行一些更改,例如,某些href包含一个绝对引用。因此,当我从代理中单击它们时,便会到达原始站点,这是一个问题。

当我尝试以字符串形式获取网站HTML时,只有特殊字符。经过一番搜索,我找到了this解决方案。它非常适合我的情况,并且我成功获取了以字符串"<!DOCTYPE html>..."开头的网站内容。更改完成后,我需要将此字符串发送到浏览器,这时我遇到了问题。我通过以下方式使用HttpResponseMessage

using (var responseStream = await responseMessage.Content.ReadAsStreamAsync())
{
    string str;
    using (var gZipStream = new GZipStream(responseStream, CompressionMode.Decompress))
    using (var streamReader = new StreamReader(gZipStream))
    {
        str = await streamReader.ReadToEndAsync();
        //some stings changes...
    }
    var bytes = Encoding.UTF8.GetBytes(str);
    using (var msi = new MemoryStream(bytes))
    using (var mso = new MemoryStream())
    {
        using (var gZipStream = new GZipStream(mso, CompressionMode.Compress))
        {
            await msi.CopyToAsync(gZipStream);
            await gZipStream.CopyToAsync(response.Body, StreamCopyBufferSize, context.RequestAborted);
        }
    }
    //next string works, but I don't change content this way
    //await responseStream.CopyToAsync(response.Body, StreamCopyBufferSize, context.RequestAborted);
}

我创建了GZipStream,成功地将MemoryStream复制到其中,然后我想使用{{1}将GZipStream复制到response.BodyHttpResponse)中}。在那一行上,我收到带有消息

的“ NotSupportedException”
  

GZipStream不支持阅读

我发现,由于某种原因,压缩到CopyToAsync GZipStream后就是gZipStream.CanRead。我试图将false复制到msi中,它不会引发异常,但是在浏览器中,我得到一个空页面(浏览器控制台中“网络中的文档响应”也为空)。

希望有人能够告诉我我做错了。

0 个答案:

没有答案