阅读和编辑一个HttpResponseMessage的内容。

3
我正在使用一个DelegatingHandler的实现,它基本上接受请求并将其转发到另一台服务器(http://localhost:9999/test/page.php -->http://otherSite.com/test/page.php) 。
在我的问题这里后,我现在必须读取页面的结果并稍微编辑一下。
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
    string url = request.RequestUri.PathAndQuery;
    UriBuilder forwardUri = new UriBuilder(_otherWebSiteBase);
    forwardUri.Path = url;

    HttpRequestMessage newRequest = request.Clone(forwardUri.Uri.ToString());

    HttpResponseMessage responseMessage = await _client.SendAsync(newRequest);
    //HERE: How to read the responseMessage.Content in string?
    return responseMessage;
}

我正在尝试阅读消息的内容,并更改其中的一些部分(基本上将所有http://otherSite.com更改为http://localhost:9999),然后返回它。

我面临的问题:

string content =await responseMessage.Content.ReadAsStringAsync();
  1. 没有返回任何可读的东西(我不确定,但我有印象可能是由于压缩造成的?)
  2. 有没有办法替换消息的内容?
1个回答

0

我想更好地理解这个问题。您是否只是希望将发送到该地址的所有请求重定向到另一个地址?鉴于您将其放在委托处理程序中,我想象这是针对每个传入请求运行的。

如果是这样,我不认为这是编写此代码的位置。我认为有两个其他地方提供了更清洁的解决方案。

在Web服务器中:

您似乎正在重新创建反向代理的概念(https://en.wikipedia.org/wiki/Reverse_proxy),其中您希望一个服务器简单地将请求指向另一个服务器,而客户端不知道更改。您可以在服务器本身上进行此修改。如果您使用的是IIS,则有指南使用IIS插件(如Application Request Routing)来实现此目的(http://www.iis.net/learn/extensions/url-rewrite-module/reverse-proxy-with-url-rewrite-v2-and-application-request-routing)。其他Web服务器也有自己的解决方案,但我个人没有尝试过。

在路由本身上

无论哪个Web API路由响应此请求,您都可以使用HTTP状态码告诉浏览器将请求重定向到其他位置。

3xx系列专门用于解决这种问题:http://www.restapitutorial.com/httpstatuscodes.html


话虽如此,如果您仍然想使用原始问题中的方法,则需要确保有适用于返回数据类型的媒体类型格式化程序。默认情况下,Web API 仅尝试使用 JSON、XML 和表单 URL 编码数据的格式化程序。如果您返回其他任何内容,则需要做更多的工作(http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters)以获取数据并对其进行操作。


感谢您的答复!关于您的第一点:这个概念有点像您所描述的,但是代理将在客户端上,并且我必须修改部分内容。此外,客户端将通过不同的主机名访问它。背后的原因是:客户端应该可以选择直接访问真实网站,并且托管Web API的C#应用程序应该能够使用Web客户端以相同的会话发送请求。 - J4N
关于您的第二点:我不确定完全理解使用这些状态码的结果是什么,但我感觉我将无法编辑返回内容,并且用户将被重定向到真实网站,这是不期望的。关于您的第三点:我期望完整的旧纯HTML(我没有代码在这里,但我非常确定它是text/html,但内容无法读取(一些未识别的字符)。我在响应头中看到了gzip,所以我需要先解压缩它吗?还是表明我不支持它? - J4N
如果压缩是关键点,那么http://www.netomatix.com/development/httpcontentencoding.aspx是一个关于Accept-Encoding HTTP头的好参考,https://msdn.microsoft.com/en-us/library/system.io.compression.gzipstream%28v=vs.110%29.aspx类将使您能够解压内容。您可以通过在Header中禁用压缩并查看返回结果来进行快速测试,但出于性能原因最好保留压缩。 - Soriin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接