2009-11-05 64 views
4

我試圖想出最合適的方式來通過HTTP代理進行雙向套接字連接 - 可以說這是一種telnet樣式的協議。不幸的是,我還需要支持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代理需要HTTP認證要求,這限制了很多事情。