source

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

nicesource 2023. 6. 23. 22:17
반응형

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

여러분 모두가 "피들러와 같은 디버깅 프록시 서버를 사용하라"고 대답할 것이라는 것을 알지만, 그렇게 간단하지 않습니다.

제 상황은 이렇습니다.ASP.NET 페이지 코드백(aspx.cs )과 같은 서버에서 실행되는 코드가 있습니다. 이 코드는 다른 서버와의 연결을 설정하고 일부 내용을 가져온 다음 형식을 지정하여 브라우저로 반환합니다.

문제는 다른 서버가 잘못된 작업을 수행하고 있다는 것입니다. 따라서 다른 서버로 보내는 완전히 원시적인 HTTP 요청을 출력하여 대체 무엇이 잘못된 것인지 알 수 있도록 디버깅 플래그를 페이지에 전달할 수 있기를 원합니다(예: ?debug=true).이 코드는 여러 곳에서 실행되므로 프로덕션 서버가 어딘가에 존재하는 프록시 서버와 통신할 수 있는지 등을 확인하지 않고 개발, 스테이징 또는 프로덕션에서 이 플래그를 전달하고 요청을 확인할 수 있습니다.

이렇게 하는 것이 쉬울 거라고 생각하실 거예요, 그렇죠?그래서 저는 제가 미친 것 같은 기분이 듭니다. 하지만 저는 HttpWebRequest와 그 부모 클래스 WebRequest에 대한 참조를 살펴보았습니다. -- 아무것도 아닙니다.할 수 없습니다.여러분은 마이크로소프트가 이것을 생각했을 것이라고 생각할 것입니다.가장 가까운 것은 "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();

나는 이것이 오래된 질문이라는 것을 깨달았습니다.@freeze의 대답은 무엇을 해야 하는지 알려주지만 설정 방법에 대해 자세히 설명하지 않습니다.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>

추가하기HttpWebRequestVisual 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

웹 서비스 클라이언트 오류의 원인을 찾을 때 특히 유용했습니다.제가 헤더를 빠뜨린 것으로 드러났습니다.

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

와이어샤크와 같은 네트워크 트래픽 탐지기를 사용할 수 있습니다.

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

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

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

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

오래된 질문인 것은 알지만 애플리케이션 구성 파일을 제어하지 못하는 어려운 상황에 처해 있었기 때문에 코드를 통해 추적을 활성화한 다음 이벤트에서 원시 요청/응답 데이터에 쉽게 액세스할 수 있는 쉬운 방법이 필요했습니다.그래서 저는 HttpRawTraceListener라는 사용자 정의 클래스를 만들었습니다. 이 클래스는 제 위치에 있는 다른 사용자에게 유용할 수 있습니다.

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

프로젝트에 파일을 추가하고 다음을 호출하는 것처럼 단순하도록 설계되었습니다.

System.Diagnostics.HttpRawTraceListener.Initialize();

추적을 시작합니다여기서 요청/응답은 추적 메시지에서 구문 분석된 다음 시스템을 통해 사용할 수 있습니다.진단.HttpRawTraceListener입니다.통신 이벤트를 마쳤습니다.

모든 시나리오(예: 프록시가 아니므로 브라우저에서 웹 요청을 캡처하지 않음)에 대해 100% 완벽하지는 않지만, 웹 서비스에 대한 HttpWebRequests 요청/응답을 캡처하는 데는 매우 효과적이며, 이러한 작업이 필요할 경우 좋은 시작점이 될 수 있습니다.

송수신 트래픽을 캡처하기 위해 텔레릭 피들러를 다운로드하는 것을 제안합니다.

다음은 이 도구를 사용하는 간단한 예입니다.

  1. Capture Traffic이 활성화되었는지 확인합니다.
  2. 브라우저를 열고 페이지를 새로 고치거나 HTTP 클라이언트를 통해 요청을 보냅니다.enter image description here
  3. Fiddler로 전환한 후에는 다음과 같은 요청이 표시됩니다.
  4. 맨 위에서 "원시" 탭을 탐색합니다.enter image description here
  5. 아래 창에 원시 요청이 있습니다.

다른 제안.고유한 웹 프록시를 구현하고 WebRequest와 함께 사용하도록 요청을 설정합니다.프록시. 그러면 프록시 인스턴스에서 트래픽을 추출할 수 있습니다.

편집: 링크를 업데이트합니다.

당신은 .NET이 당신에게 거짓말을 하고 있다고 생각한다고 말하고, 당신이 제공하는 구체적인 예는 헤더입니다.Content-LengthHTTP 응답에 없습니다.

하지만 머리말은Content-LengthHTTP 응답에는 필요하지 않습니다.사실 응답의 본문이 어떤 역학적인 것이고, 그 길이를 미리 알 수 없다면, 그 가능성은 매우 높습니다.Content-Length헤더가 생략됩니다!

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

반응형