2010-06-22 55 views
2

我有createst持久(保持活動)連接到服務器的WebRequest的,例如:爲什麼我會在webrequest中訪問endOfStream,如果它是持久(保持連接)連接?

webRequest.ContentType = "application/x-www-form-urlencoded"; 
        // Set the ContentLength property of the WebRequest. 
        webRequest.ContentLength = byteArray.Length; 
        webRequest.Timeout = Timeout.Infinite; 
        webRequest.KeepAlive = true; 
        webRequest.ReadWriteTimeout = Timeout.Infinite; 
        //[System.Threading.Timeout]::Infinite 

        webRequest.UserAgent = "www.socialblazeapp.com"; 
        Stream dataStream = webRequest.GetRequestStream(); 
        // Write the data to the request stream. 
        dataStream.Write(byteArray, 0, byteArray.Length); 
        // Close the Stream object. 
        dataStream.Close(); 
        // Get the response. 
        webResponse = (HttpWebResponse)webRequest.GetResponse(); 
        Encoding encode = System.Text.Encoding.GetEncoding("utf-8"); 
        responseStream = new StreamReader(webResponse.GetResponseStream(), encode); 
        while(!responseStream.EndOfStream){ //do something} 

我不知道爲什麼responseStream.EndOfStream一段時間後變爲真。我會假設因爲這是一個持久的連接,這個流永遠不會關閉?

任何想法爲什麼會發生這種情況?

回答

2

我認爲你很困惑保持TCP連接打開並保持響應流打開。 TCP連接是基礎傳輸介質,而請求和響應是通過該連接進行通信的各個實體。

通過持續連接,您[理論上]可以在同一連接上發出多個請求/響應對。如果沒有持久連接,您基本上會打開連接,發出請求,接收響應,然後關閉連接,然後爲後續請求/響應對重複該過程。

但是,響應本身的大小是有限的,一旦你收到完整的響應,流應該關閉,因爲沒有什麼可以告訴你的。一旦你發出另一個請求,另一個響應會隨之而來;我不清楚.Net是否會重用基礎的持久連接。

+0

這是有道理的,所以我們可以說我想保持一個連接打開到Web服務器幾個小時(與數據流整個時間),我將如何實現這一目標? – rksprst 2010-06-22 00:43:31

+0

根據你在這裏的問題和其他答案,我認爲你誤解了流和連接持久性的概念。無論連接類型如何,HTTP都是請求/響應對話。你總會發出一個有限的請求,而服務器總會給你一個有限的響應,這意味着響應結束了。根據我的理解(如果我錯了,糾正我)基本上是一種具有單個響應流變量並且能夠反覆使用它的方法。你無法做到這一點。 – CodingGorilla 2010-06-22 01:06:20

+0

我想要做的是連接到Twitter的流媒體API(http://dev.twitter.com/pages/streaming_api)在「連接」部分下,他們有文字表示你應該能夠做到這一點爲了通過HTTP連接到流API。 如果我無法通過HTTP保留響應流,那麼我不明白Twitter如何維持連接?或者,我又誤解了一些東西? – rksprst 2010-06-22 01:13:36

1

所有應該做的就是保持打開TCP連接。如果我正確地閱讀它,這意味着您可以重複使用相同的物理TCP連接來對給定服務器發出多個請求。它不會做的是保持您的流打開,以便服務器可以發送更多信息。

如果你真的想要流式傳輸數據,你應該使用不同的協議或直接的TCP。

+0

你知道任何顯示完整數據流的例子嗎? – rksprst 2010-06-22 00:44:11

+0

基本上TCP上的任何例子都可以,但這裏有一個體面的起點。 http://www.codeproject.com/KB/IP/socketsincsharp.aspx – 2010-06-22 00:50:16

+0

我使用這個Twitter的流媒體API(http://dev.twitter.com/pages/streaming_api),只是看着他們的文檔,他們想一個HTTP連接。有沒有什麼辦法可以使讀取流與HTTP連接保持一致?我只是試圖再次獲得響應流,但它看起來只會在新連接建立時才起作用。 – rksprst 2010-06-22 00:58:17