我正在尝试在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());
}
}
我不确定自己在做什么错,因为这或多或少是网站中示例代码的副本,只是做了些微改动。
结果应为任意,正文中的所有URL均应以 “ / proxy /”,并且应将其应用于用户导航到的任何URL。
值得一提的是,如果我删除“ TransformResponse”部分,此方法就足够好了。
关于我在这里做错什么的任何想法。
谢谢。
更新:
要返回的部分内容。在这种情况下,导航的网址为“ https://www.theverge.com”。
?p?}^??d????i+s4?~?<???$?x]??????j??u?,?z?md?F6??G??{???g;?tU??q???????08;???vφ????N?? k???d8??l??GA?x???p?";?f??yk2?R?r2??
fA?z?7Q?Y}??2?v????p<|dù?s???q????t?M?^0_???o?/??V???z?S?5??r-s?N?U?j?:??1Bo?Z?>?-?
??u??{{*v????Q?g??s4?? ;?$;?Q???A0??YFo/{:;6??{?q/;?????????G????s??.??g?E?????w??'wL{?Lw0?-¬?????~????p?u??TC?X??J?j??lW??Z??(???z?u?u????a?W???~?R?t{?J?Q??f?^?6k?R?X????]^M?3??_g?????Y? *????l?xp?sT
~??9?L??4D{1q3V??r??;?'9He(??FeCTP[??/???T?{??j%??h?????@?f?e??k???p?R?&?VM????n<R?+???wR??? ????p?pyo#y??a??7L?????7VL??6n#0o,m?q????????J??#?+-Io??pr#n|????|qU?7?:??mVT?y?M??Mf ??"?=?B??u??F?X/4??f?^,?^?t????N???????fk??T!??y{?SG???a??'???#EWz?O???{???????po~?V]?Vo????Y?σ??@??2QTg??4??n????4?=???P5j!?j????}?7?M'??[??A?/[=?Q??O??? ~-^???,?/f??U?????p???A:??????M.`?.R??????8??]+???T??|o?0????????GD?_0???'{??~x?3?tM??Xe{???T0, f8!?w?j?m=??3??f?????[q?????}??a???r?????l??d[)?????p?w
答案 0 :(得分:0)
输出乱码是因为返回的下游响应已压缩,但是您试图将其直接读取为字符串。
如果代理响应被压缩,则需要将其解压缩,进行任何字符串转换,然后再压缩回去,例如:
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);
}
}
});