2011-01-03 1 views
3

Я пытаюсь получить больше информации о том, что происходит, когда я подключаюсь к веб-сайту на более низком уровне, чем это дает мне HttpWebRequest и HttpWebResponse. Я использую C#.Получить базовое соединение tcp из HttpWebRequest/Response

Я хотел был бы иметь возможность увидеть информацию о поиске dns и времени, необходимое для установления соединения (если было установлено новое соединение). HttpWebRequest и HttpWebResponse работают на более высоком уровне, чем это, и я хочу спросить, есть ли способ получить базовый объект TcpClient (или любой другой объект низкого уровня, который они используют).

Если это невозможно, то есть способ захватить и управлять списком соединений, которые поддерживает .net, не получая его через HttpWebRequest или HttpWebResponse?

Я не могу изменить приложение, над которым я работаю, использовать TcpClient, потому что было бы слишком трудоемким, чтобы надежно реализовать весь HTTP-файл.

+1

Не уверен насчет «TcpClient», но я уверен, что они используют класс «Socket», поэтому ищите его. Кроме того, когда вы прерываете и отлаживаете, вы указываете объекты и видите даже их частные члены. Это должно дать вам какое-то направление. – Poni

+0

Я не думал оглядываться на частных членов, спасибо. К сожалению, я не мог найти много. Я видел, что ServicePoint имеет непубличную переменную, называемую LastDnsResolve, которая, как я полагаю, занимает время последнего разрешения DNS. Я могу использовать это для небольшой части моей проблемы. – Zane

ответ

3

Самое лучшее, что я могу заставить вас это создать файл 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> 

Это позволит отслеживать и будет выгонять файл журнала с именем «System.Net.trace. log "в папке вашего приложения. Вы не получите всю информацию, которую ищете, и ее нелегко расходуете, пока приложение работает, но по крайней мере вам не нужно запускать стороннюю программу. Его не документировано слишком много, но есть, по крайней мере, some information.

+2

Основываясь на этой идее, вы можете написать свой собственный «TraceListener», который позволит вам отслеживать все log в том же процессе во время выполнения. –

+0

Отличная точка @ Стефен Клири! –

+0

спасибо, это похоже близко. Я написал TraceListener, как было предложено, и может получить некоторую информацию из трасс сокета. К сожалению, однако я не могу сопоставить определенный элемент трассировки, который показывает информацию о сокетах, к конкретному HttpWebResponse, с которым он связан. – Zane

2

Используйте Wireshark, это лучший способ узнать все это.

+0

Согласен. Точка HttpWebRequest - это абстрактное/скрытие сложных деталей. Компромисс для удобства использования состоит в том, что вы должны принять некоторые «магии» на более низких уровнях. –

+0

Согласен. Вместо того, чтобы обманывать внутренности .net, просто отслеживайте запросы, когда они идут по проводу. Это должно дать вам точное время, когда все происходит. – NotMe

+0

Я использую wirehark, но я хотел бы сделать то же самое в .net: отслеживать подключения tcp. Мой вопрос, возможно, был неясным, я хотел бы иметь возможность получать эту информацию многократно и автоматически в .net, а не только для устранения неполадок. Если вы не предполагаете, что я использую WinPcap или API Wireshark (это существует?). Но это переводит его на другой уровень, и я хотел бы избежать этого, если это возможно. – Zane

1

Если нет Wireshark, тогда используйте Fiddler.

+0

Я тоже использую скрипач. Но это заставляет меня думать, как скрипач получает свою статистическую информацию? Он сообщает о времени соединения TCP/IP и записывается на C#. Использует ли он TcpClient/Sockets? Скрипач очень обширен в том, что он может сделать. Я чувствовал бы себя слишком виноватым, чтобы разобрать его, посмотреть, как это делается, а затем использовать ту же идею, потому что я считаю, что это неправильно (и это, вероятно, незаконно). – Zane

+2

Fiddler - это HTTP-прокси - так что Fiddled включен в браузер/любой другой HTTP-клиент отправляет запросы локальному прокси (Fiddler) и перенаправляет их на фактический сервер. В результате он знает все о запросах и ответах, поскольку сам отправляет их. Но это не похоже на то, что вам нужно из оригинального вопроса - вам, похоже, нужна статистика HTTP/TCP для вашего процесса ... –