servicestack,C#,.net,Windows,servicestack" /> servicestack,C#,.net,Windows,servicestack" />

C# 如何在ServiceStack ProxyFeature中正确解码响应流?

C# 如何在ServiceStack ProxyFeature中正确解码响应流?,c#,.net,windows,servicestack,C#,.net,Windows,servicestack,我试图在ProxyFeature中替换响应体中的URL,但得到的是编码体 代码如下: Plugins.Add(new ProxyFeature( matchingRequests: req => { return req.PathInfo.StartsWith("/proxy"); }, resolveUrl: (req) => { st

我试图在ProxyFeature中替换响应体中的URL,但得到的是编码体

代码如下:

Plugins.Add(new ProxyFeature(
          matchingRequests: req =>
          {
            return req.PathInfo.StartsWith("/proxy");
          },
          resolveUrl: (req) =>
          {
            string var = req.RawUrl.Replace("/proxy/", "");
            return var;
          })
      {
        IgnoreResponseHeaders = {
                    "X-Frame-Options"
                },
        TransformResponse = async (res, responseStream) =>
        {          
          using (var reader = new StreamReader(responseStream,Encoding.UTF8))
          {
            var responseBody = await reader.ReadToEndAsync();
            Console.WriteLine(responseBody);
            var replacedBody = responseBody.Replace("http://","/proxy/http://");
            replacedBody = replacedBody.Replace("https://", "/proxy/https://");

            return MemoryStreamFactory.GetStream(replacedBody.ToUtf8Bytes());
          }
        }
我不确定我做错了什么,因为这或多或少是网站中的示例代码的一个副本,有一些小改动

结果应该是any,主体中的所有URL都应该由 “/proxy/”,这应该应用于用户导航到的任何URL

值得一提的是,如果我删除“TransformResponse”部分,这就足够好了

你知道我做错了什么吗

谢谢。

更新:

正在返回的部分内容。本例中导航的url为“”


?p?}^d???i+s4?~?乱码输出是因为返回的下游响应被压缩,而您试图将其作为字符串直接读取

如果代理响应已压缩,则需要对其进行解压缩,进行任何字符串转换,然后将其压缩回去,例如:

Plugins.Add(new ProxyFeature(
    matchingRequests: req => req.PathInfo.StartsWith("/proxy"),
    resolveUrl: req => req.RawUrl.Replace("/proxy/", ""))
{
    IgnoreResponseHeaders = { "X-Frame-Options" },
    TransformResponse = async (res, responseStream) => {
        var enc = res.GetHeader(HttpHeaders.ContentEncoding);
        var useStream = responseStream;
        if (enc != null)
            useStream = responseStream.Decompress(enc);

        using (var reader = new StreamReader(useStream,Encoding.UTF8))
        {
            var responseBody = await reader.ReadToEndAsync();
            var replacedBody = responseBody.Replace("http://","/proxy/http://");
            replacedBody = replacedBody.Replace("https://", "/proxy/https://");

            var bytes = replacedBody.ToUtf8Bytes();
            return new MemoryStream(enc != null ? bytes.CompressBytes(enc) : bytes);
        }
    }
});

请更新您的问题,以包含代理返回的原始HTTP响应。@mythz这就是您的意思吗?谢谢太好了,现在我可以访问实际的HTML和所有内容,但内容不再呈现,即使我跳过所有替换位。有没有办法将错误转储到环境中,所以假设加载HTML时出错,我可以像在浏览器中一样看到错误吗?顺便说一句,我正在运行包装在Windows应用程序for context中的ASP.NET内核。@Oakcool使用C#调试器,或使用日志来验证实际发生的情况,或使用HTTP调试器(如WebInspector或Fiddler)来查看返回的HTML。
Plugins.Add(new ProxyFeature(
    matchingRequests: req => req.PathInfo.StartsWith("/proxy"),
    resolveUrl: req => req.RawUrl.Replace("/proxy/", ""))
{
    IgnoreResponseHeaders = { "X-Frame-Options" },
    TransformResponse = async (res, responseStream) => {
        var enc = res.GetHeader(HttpHeaders.ContentEncoding);
        var useStream = responseStream;
        if (enc != null)
            useStream = responseStream.Decompress(enc);

        using (var reader = new StreamReader(useStream,Encoding.UTF8))
        {
            var responseBody = await reader.ReadToEndAsync();
            var replacedBody = responseBody.Replace("http://","/proxy/http://");
            replacedBody = replacedBody.Replace("https://", "/proxy/https://");

            var bytes = replacedBody.ToUtf8Bytes();
            return new MemoryStream(enc != null ? bytes.CompressBytes(enc) : bytes);
        }
    }
});