C# 如何在ServiceStack ProxyFeature中正确解码响应流?
我试图在ProxyFeature中替换响应体中的URL,但得到的是编码体 代码如下: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
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);
}
}
});