C# 从HttpWebRequest/Response获取底层tcp连接

C# 从HttpWebRequest/Response获取底层tcp连接,c#,.net,httpwebrequest,tcpclient,C#,.net,Httpwebrequest,Tcpclient,当我连接到一个比HttpWebRequest和HttpWebResponse提供给我的级别更低的网站时,我试图获得更多关于发生了什么的信息。我用的是C# 我希望能够看到有关dns查找的信息以及建立连接所需的时间(如果建立了新连接)。HttpWebRequest和HttpWebResponse在比这更高的级别上工作,我想问一下是否有一种方法可以获取底层的TcpClient对象(或者它们使用的任何低级对象) 若不可能,那个么有并没有一种方法可以在不通过HttpWebRequest或HttpWebRe

当我连接到一个比HttpWebRequest和HttpWebResponse提供给我的级别更低的网站时,我试图获得更多关于发生了什么的信息。我用的是C#

我希望能够看到有关dns查找的信息以及建立连接所需的时间(如果建立了新连接)。HttpWebRequest和HttpWebResponse在比这更高的级别上工作,我想问一下是否有一种方法可以获取底层的TcpClient对象(或者它们使用的任何低级对象)

若不可能,那个么有并没有一种方法可以在不通过HttpWebRequest或HttpWebResponse获取的情况下获取和操作.net正在维护的连接列表


我无法将正在处理的应用程序更改为使用TcpClient,因为要可靠地实现所有http内容太耗时了

使用Wireshark,这是查找所有这些内容的最佳方法。

如果不是Wireshark,那么使用。

我能为您提供的最佳方法是创建一个包含以下信息的app.config文件:

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <system.diagnostics>
        <trace autoflush="true" />
            <sources>
                <source name="System.Net" maxdatasize="1024">
                    <listeners>
                        <add name="MyTraceFile"/>
                    </listeners>
                </source>
              <source name="System.Net.Sockets" maxdatasize="1024">
                    <listeners>
                        <add name="MyTraceFile"/>
                    </listeners>
                </source>  
           </sources>


            <sharedListeners>
                <add
                  name="MyTraceFile"
                  type="System.Diagnostics.TextWriterTraceListener"
                  initializeData="System.Net.trace.log"
                />
            </sharedListeners>
            <switches>
                <add name="System.Net" value="Verbose" />
              <add name="System.Net.Sockets" value="Verbose" />
            </switches>
    </system.diagnostics>
</configuration>


至少在那里。

不确定“TcpClient”,但我确定他们使用“Socket”类,所以请查找它。此外,当您中断点和调试时,您可以指向对象,甚至可以看到它们的私有成员。这应该会给你一些指导。我没想过要看私人会员,谢谢。不幸的是,我找不到太多。我确实看到ServicePoint有一个名为LastDnsResolve的非公共变量,我假设它保存最后一次DNS解析的时间。我可以用它来解决我的一小部分问题,我同意。HttpWebRequest的目的是抽象/隐藏复杂的部分。对于易用性的权衡是,你必须接受一些较低级别的“魔法”。我同意。不要乱搞.net的内部结构,只要在请求通过网络时监视它们就行了。这将为您提供所有事情发生的确切时间。我确实使用wireshark,但我想在.net中做同样的事情:监视tcp连接。我的问题可能还不清楚,我希望能够在.net中反复自动地获取这些信息,而不仅仅是一次性的故障排除。除非您建议我使用WinPcap或Wireshark API(是否存在?)。但这是把它带到了另一个层次,如果可能的话,我想避免这种情况。我也使用fiddler。但这让我想,小提琴手是如何获得统计信息的?它报告TCP/IP连接时间,并用C#编写。它是否使用TcpClient/Sockets?Fiddler的功能非常广泛。我会觉得很内疚,不想拆开它,看看它是如何完成的,然后使用相同的想法,因为我觉得这是错误的(而且可能是非法的)。Fiddler是HTTP代理-所以当Fiddle打开浏览器/任何其他HTTP客户机时,它会将请求发送到本地代理(Fiddler),并将它们重新发送到实际的服务器。因此,它知道关于请求和响应的一切,因为它自己发送请求和响应。但这听起来不像是您在最初的问题中所需要的—您的流程似乎需要HTTP/TCP统计信息……基于这个想法,您可以编写自己的
TraceListener
,这将使您能够在运行时跟踪同一流程中的所有日志。谢谢,这似乎很接近。我已经按照建议编写了一个TraceListener,可以从套接字跟踪中获得一些信息。但不幸的是,我无法将显示套接字信息的特定跟踪项与它关联的特定HttpWebResponse相匹配。令人沮丧的是,我可以看到.NET在幕后使用套接字,但无法访问它们。有没有办法使用跟踪中显示的唯一对象ID之一从.NET获取对象?您可以使用
Trace.CorrelationManager.ActivityId
。它是自动包含在跟踪中的每线程值。我不认为HttpWebResponse使用它,所以你必须自己设置它。我知道这是一个很晚才接受的问题,但我从来没有按照计划让它工作。我认为这是最好的建议。我在试图解析TraceListener中的消息时遇到了一些问题,无法找到可靠的方法将单个请求的所有信息串在一起,因为许多线程同时运行。