Programing

HttpWebRequest 클래스가 보내는 원시 HTTP 요청을 어떻게 볼 수 있습니까?

lottogame 2020. 11. 20. 08:25
반응형

HttpWebRequest 클래스가 보내는 원시 HTTP 요청을 어떻게 볼 수 있습니까?


모두 "Fiddler와 같은 디버깅 프록시 서버 사용"이라고 대답 할 것이라는 것을 알고 있지만 그렇게 간단하지는 않습니다.

내 상황은 다음과 같습니다. ASP.NET 페이지 코드 숨김 (aspx.cs)에서 서버에서 실행되는 코드가 있습니다.이 코드는 다른 서버에 대한 연결을 설정하고 일부 항목을 가져온 다음 서식을 지정합니다. 브라우저에 반환합니다.

문제는 다른 서버가 잘못된 일을하고 있으므로 디버깅 플래그를 페이지에 전달하여 (예 :? debug = true 쿼리 문자열을 통해) 완전히 원시 HTTP를 인쇄 할 수 있기를 원합니다. 도대체 잘못된 것이 무엇인지 알 수 있도록 다른 서버로 전송하도록 요청하십시오. 이 코드는 여러 곳에서 실행되고 있으므로 프로덕션 서버가 어딘가에있는 프록시 서버와 통신 할 수 있는지 여부를 파악하지 않고도 dev, 스테이징 또는 프로덕션에서이 플래그를 전달하고 요청 만 볼 수 있기를 원합니다. 등

이게 쉬울 거라고 생각 하겠죠? 그래서 나는 내가 미쳤다고 느낀다.하지만 HttpWebRequest와 그 부모 클래스 WebRequest에 대한 참조를 보았습니다. 할 수 없습니다. Microsoft가 이것을 생각했을 것이라고 생각할 것입니다. 가장 가까운 것은 "Headers"컬렉션에 액세스 할 수 있다는 것입니다.하지만 시도했을 때 "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();

System.Net 추적 메커니즘을 사용하여 유선으로 전송 된 원시 HTTP 요청을 볼 수 있습니다. 프로세스에 자체 추적 수신기를 추가 할 수도 있습니다.


나는 이것이 오래된 질문이라는 것을 알고 있습니다. @feroze의 대답 은 무엇을 해야할지 말하지만 System.Net추적을 설정하는 방법에 대해서는 자세히 설명하지 않습니다 .

이 질문은 주제에 대한 내 쿼리에 대한 첫 번째 Google 결과였으며 우리 모두 바쁜 사람들이기 때문에이 정보를 찾아 내지 않아도되는 모든 것을 구할 수있을 것이라고 생각했습니다.

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코드에 단순 추가하고 Visual Studio에서 디버깅 모드로 실행하면 디버그 콘솔에 다음 정보가 표시됩니다.

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

웹 서비스 클라이언트 오류의 원인을 찾으려고 할 때 특히 유용하다는 것을 알았습니다. 헤더가 누락 된 것으로 나타났습니다.


wireshark 와 같은 네트워크 트래픽 스니퍼를 사용할 수 있습니다 .

이것은 디버깅 프록시는 아니지만 모든 트래픽 을 스니핑 하고 원시 요청 / 응답을 볼 수 있도록합니다.


다른 방법을 생각했기 때문에 여기에서 내 질문에 답했습니다. 기본적으로 아이디어는 들어오는 원시 HTTP 요청을 기록하는 페이지로 HttpWebRequest를 다시 가리 킵니다. 즉,이 포럼 게시물에 따라 사용자 지정 HTTP 처리기를 설정합니다.

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

그런 다음이 새 끝점을 가리 키도록 HttpWebRequest의 URL 만 변경하고 요청의 다른 모든 요소는 동일하게 유지합니다. 결과를 파일이나 다른 것에 쓰면 당신은 황금입니다.


수신 / 발신 트래픽을 캡처하려면 Telerik Fiddler 를 다운로드하는 것이 좋습니다 .

여기에 해당 도구로 수행하는 간단한 예가 있습니다.

  1. 트래픽 캡처가 활성화되어 있는지 확인하십시오. 여기에 이미지 설명 입력
  2. 브라우저를 열고 페이지를 새로 고치거나 HTTP 클라이언트를 통해 요청을 보냅니다. 여기에 이미지 설명 입력
  3. Fiddler로 전환하면 요청이 표시됩니다. 여기에 이미지 설명 입력
  4. 상단에서 "Raw"탭을 탐색 해보십시오. 여기에 이미지 설명 입력
  5. 아래 창에는 원시 요청이 있습니다. 여기에 이미지 설명 입력

또 다른 제안. 자체 웹 프록시를 구현 하고 WebRequest.Proxy 와 함께 사용하도록 요청을 설정합니다 . 그런 다음 프록시 인스턴스에서 트래픽을 추출 할 수 있어야합니다.

편집 : 링크 업데이트.


.NET이 거짓말이라고 생각하고 구체적인 예 Content-Length는 HTTP 응답에서 헤더 가 누락되었다는 것입니다.

But the header Content-Length is not required from an HTTP response. In fact, if the body of the response is in any dynamic, and if its length is not known in advance, then it is highly likely that the Content-Length header will be omitted!


I know this is an old question, but I was in a tough spot where I didn't control the application config file, so I needed an easy way to enable the tracing via code and then easily access the raw request/response data in an event. So I put together this custom class, HttpRawTraceListener, which might be of use to others that are in my position:

https://github.com/jhilgeman/HttpRawTraceListener/blob/master/HttpRawTraceListener.cs

It was designed to be as simple as adding the file to your project, then calling:

System.Diagnostics.HttpRawTraceListener.Initialize();

...to start the trace. From there, requests/responses will be parsed out of the trace messages and then be made available via the System.Diagnostics.HttpRawTraceListener.FinishedCommunication event.

It's probably not 100% perfect for every scenario (e.g. it's not a proxy, so it won't capture web requests from a browser, for example), but it works pretty well for capturing HttpWebRequests requests/responses to web services, and it might be a good starting point if you need something like this.


I must be missing something, because getting the raw HTTP request as ASCII text is really easy, as long as you grab it in the Page_Init() it'll be different by Page_Load().

protected void Page_Init(object sender, EventArgs e)
{
    //this gets the raw request as an ASCII String.
    byte[] biData = Request.BinaryRead(Request.TotalBytes);
    string sWholeRequestAsString = System.Text.Encoding.ASCII.GetString(biData);

}

참고 URL : https://stackoverflow.com/questions/3808016/how-do-i-see-the-raw-http-request-that-the-httpwebrequest-class-sends

반응형