2009-11-05 14 views
4

HTTP 프록시를 통한 양방향 소켓 연결을 만드는 가장 적합한 방법을 제안하려고합니다. 텔넷 스타일 프로토콜이라고 할 수 있습니다. 불행히도 NTLM 인증 (프록시 사용)은 물론 기본 및 다이제스트뿐만 아니라 앞으로 예측할 수없는 다른 인증 메커니즘도 지원해야합니다.HTTP 프록시를 통한 양방향 통신

그냥 기본이고 다이제스트라면 직접 연결을 처리 할 수는 있지만 실제로는 NTLM 인 진창에 갇히지 않으려 고합니다. 기본 AuthenticationManager API를 보면 HttpWebRequest와 매우 유사하게 보이므로 소켓/tcpclient /를 사용하거나 새로운 WebRequest 파생 클래스를 작성하는 경우 해당 기능을 활용할 수 없습니다.

HttpWebResponse로 재생하면 응답 스트림을 검색 한 후 RequestStream을 사용하여 쓸 수없는 스트림이 생성되어 동시 io 예외가 발생합니다.

허용 나는 내가 HttpWebRequest를하는과 관련된는 NetworkStream을 얻을 성가신 코드로 왔어요, 생각할 수있는 모든 가능성을 통해 실행하는 데 두 가지 방법으로 통신 : 난

..... 
    HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); 
    Stream str = resp.GetResponseStream(); 

    System.Type type = str.GetType(); 
    PropertyInfo info = type.GetProperty("Connection", BindingFlags.NonPublic|BindingFlags.Instance| BindingFlags.Public); 
    object obj = info.GetValue(str, null); 
    type = obj.GetType(); 
    info = type.GetProperty("NetworkStream", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public); 
    object obj2 = info.GetValue(obj, null); 
    NetworkStream networkStream = obj2 as NetworkStream; 

상당히 반발했다. (처음에는 Mono와 작동하지 않을 것이다.) 따라서 프록시 인증의 런타임 기능을 활용할 수있는 공개 API를 사용하는 것이 더 좋은지 궁금하다.

답변

2

HTTP는 두 가지 방법입니다. 클라이언트는 HTTP GET을 사용하여 데이터가없는 요청을 보낼 수 있지만 (데이터가 URL 또는 헤더에 포함될 수 있음에도) HTTP POST를 사용하여 데이터를 보낼 수 있으며 서버는 헤더와 데이터로 응답을 보냅니다.

"양방향"이라고 말하면 클라이언트와 서버가 읽고 쓸 수있는 간단한 TCP 소켓과 비슷한 것을 생각하면 미안하지만 HTTP와는 다릅니다. 클라이언트가 요청을 보내고 서버가 응답을 감지합니다. 그게 다야. 기술적 인면에서 클라이언트 측 API를 사용하지 않고 HTTP의 의도 된 제약 조건을 적용하고 자신의 비표준 서버를 만들 수 있다면 하나의 HTTP 내에서 복수 클라이언트 < -> 서버 교환을 할 수 있습니다 요청하지만, 그 시점에서 HTTP가 아니기 때문에 핸드 셰이크와 같은 HTTP를 사용하는 TCP 연결이되어 프록시에서 허용하지 않을 수도 있습니다.

즉, 실제로 응답 스트림에 쓸 필요가없는 것처럼 들리 겠지만, 매우 혼란 스럽거나 POST (GetRequestStream 참조)를 수행해야 할 필요가 있습니다. 조금 혼란스러워하고 응답을 처리 한 후에 새로운 요청을 보낼 수 있습니다. WebResponse에서 .Close 메서드를 호출하면 동일한 HttpWebRequest 인스턴스를 다시 사용할 수도 있습니다. 그리고이 모든 것은 동일한 TCP 소켓에서 발생합니다 (서버와 프록시가이를 지원할 경우).

오케이, 나는 모두 의미가 있기를 바랍니다. 그것이 한 가지 방법이나 다른 방법으로 질문에 대답하지 못했다면 "양방향"커뮤니케이션과 관련하여 성취하고자하는 것에 대해 좀 더 자세하게 설명하십시오. HTTP 인증 요구 사항이있는 HTTP 프록시를 통과해야한다는 제약이 있다는 것을 이해합니다.