如何查看 HttpWebRequest 类发送的原始 HTTP 请求?

我知道你们都会回答“使用像 Fiddler 这样的调试代理服务器”,但事情没有那么简单。

我的情况是这样的: 我有一些运行在服务器上的代码,在一个 ASP.NET 页面代码隐藏(aspx.cs)中,它(在其他事情中)建立到 另一个服务器的连接,抓取一些东西,然后格式化它并返回给浏览器。

问题是另一台服务器正在做错误的事情,因此我希望能够将一个调试标志传递到页面中(通过查询字符串,例如?Debug = true) ,这样它将打印出发送给其他服务器的 完全原始 HTTP 请求,这样我就可以看到到底出了什么问题。这段代码在几个地方运行,所以我希望能够在开发、准备或生产环境中传递这个标志,只看到请求,而不必弄清楚生产服务器是否可以与某个地方存在的代理服务器通信,等等。

你以为这很容易,对吧?所以我觉得我是疯了还是怎么的,但是我看了 HttpWebRequest 的引用和它的父类 WebRequest,什么都没有。不行。你可能会认为微软会考虑到这一点。最接近的情况是,你可以访问“ Header”集合,但是当我尝试它时,它忽略了一些真正重要的标题,比如“ content length”——所以它一定是在“撒谎”(我知道它在撒谎,因为我知道远程服务器正在返回一个200状态——请求成功了,它只是返回错误的/不同的/错误的数据)

下面是请求的代码示例:

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://www.whatever.com");
req.Method = ... whatever ...;
... other setup for the request ...
/* At this point we are about to send the request.
What does the raw HTTP request look like? */
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
91367 次浏览

您可以使用像 电鲨这样的网络流量嗅探器。

这不是一个调试代理,但是将嗅探 所有流量并让您看到原始请求/响应。

另一个建议。0,并将请求设置为与 WebRequest 代理一起使用它。然后您应该能够从代理实例中提取流量。

编辑: 更新链接。

您可以使用 System。Net 跟踪机制来查看在线路上发送的原始 HTTP 请求。还可以向进程添加自己的跟踪监听器。

你说你认为。NET 对您撒谎,您给出的具体示例是 HTTP 响应中缺少头 Content-Length

但是 HTTP 响应不需要标头 Content-Length。实际上,如果响应的主体处于任何动态状态,并且事先不知道它的长度,那么很可能会忽略 Content-Length头部!

回答我自己的问题,因为我想到了另一种方法。其基本思想是——将 HttpWebRequest 重新指向一个页面,该页面记录传入的原始 HTTP 请求。换句话说,根据这篇论坛文章设置一个定制的 HTTP 处理程序:

Http://forums.asp.net/t/353955.aspx

然后仅修改 HttpWebRequest 中的 URL 以指向这个新端点,但是保持请求的所有其他元素不变。把结果写到一个文件或什么东西里,你就成功了。

我知道这是个老问题了。@ 狰狞的回答说了要做什么,但没有详细说明如何建立 System.Net跟踪来实现它。

由于这个问题是我对这个主题的第一个搜索结果,而且我们都是忙碌的人,我想我可以让你们不必搜索这些信息。

System.Web对于调试 HttpWebRequest非常强大,可以很容易地使用 web.config设置:

<configuration>
<system.diagnostics>


<trace autoflush="true" />


<sources>
<source name="System.Net" maxdatasize="1024">
<listeners>
<add name="MyTraceFile"/>
<add name="MyConsole"/>
</listeners>
</source>
</sources>


<sharedListeners>
<add
name="MyTraceFile"
type="System.Diagnostics.TextWriterTraceListener"
initializeData="System.Net.trace.log" />
<add name="MyConsole" type="System.Diagnostics.ConsoleTraceListener" />
</sharedListeners>


<switches>
<add name="System.Net" value="Verbose" />
</switches>


</system.diagnostics>
</configuration>

在代码中添加一个简单的 HttpWebRequest,并在 VisualStudio 中以调试模式运行,调试控制台中将显示以下信息:

System.Net Verbose: 0 : [6596] WebRequest::Create(https://example.com/service.asmx)
System.Net Verbose: 0 : [6596] HttpWebRequest#62063506::HttpWebRequest(https://example.com/service.asmx#11234)
System.Net Information: 0 : [6596] RAS supported: True
System.Net Verbose: 0 : [6596] Exiting HttpWebRequest#11234::HttpWebRequest()
System.Net Verbose: 0 : [6596] Exiting WebRequest::Create()     -> HttpWebRequest#11234
System.Net Verbose: 0 : [6596] HttpWebRequest#11234 ::GetRequestStream()
System.Net Verbose: 0 : [6596] ServicePoint#11234 ::ServicePoint(example.com:443)
System.Net Information: 0 : [6596] Associating HttpWebRequest#11234with ServicePoint#11234
System.Net Information: 0 : [6596] Associating Connection#11234 with HttpWebRequest#11234
System.Net Information: 0 : [6596] Connection#11234 - Created connection from x.x.x.x:xx to x.x.x.x:xx.
System.Net Information: 0 : [6596] TlsStream#11234 ::.ctor(host=example.com, #certs=0)
System.Net Information: 0 : [6596] Associating HttpWebRequest#11234 with ConnectStream#11234
System.Net Verbose: 0 : [6596] Exiting HttpWebRequest#11234 ::GetRequestStream()    -> ConnectStream#11234
System.Net Verbose: 0 : [6596] ConnectStream#7740977::Write()
System.Net Verbose: 0 : [6596] Data from ConnectStream#11234::Write
System.Net Verbose: 0 : [6596] 00000000 : 3C 73 6F 61 70 3A 45 6E-76 65 6C 6F 70 65 0D 0A : <soap:Envelope..
...etc

我发现这在试图找出 Web 服务客户端错误的原因时特别有用。结果我错过了一个标题。

我建议您下载 Telerik Fiddler来捕捉传入/传出流量。

这里有一个简单的例子如何使用这个工具:

  1. 确保已启用捕获流量: enter image description here
  2. 打开浏览器并刷新页面,或者通过 HTTP 客户端发送请求。 enter image description here
  3. 在切换到 Fiddler 之后,您应该会看到您的请求: enter image description here
  4. 在顶部尝试导航“原始”标签。 enter image description here
  5. 在下面的窗口中是您的原始请求 enter image description here

我知道这是一个老问题,但是我处在一个不能控制应用程序配置文件的困境中,所以我需要一种简单的方法来通过代码启用跟踪,然后在事件中轻松访问原始请求/响应数据。因此,我将这个定制类 HttpRawTraceListener 放在一起,它可能对处于我这个位置的其他人有用:

Https://github.com/jhilgeman/httprawtracelistener/blob/master/httprawtracelistener.cs

它被设计成只需将文件添加到项目中,然后调用:

System.Diagnostics.HttpRawTraceListener.Initialize();

开始追踪。从那里,请求/响应将从跟踪消息中解析出来,然后通过 系统。诊断。 HttpRawTraceListener。完成通信事件提供。

它可能不是100% 适用于所有场景(例如,它不是一个代理,所以它不会捕获来自浏览器的 Web 请求,例如) ,但它对捕获 HttpWebRequest 请求/对 Web 服务的响应非常有效,如果你需要这样的东西,它可能是一个很好的起点。