2010-02-05 25 views
7

我在使用HttpWebRequest對嵌入式設備上的HTTP守護進程時遇到問題。問題似乎是,在寫入到套接字流的http頭文件和http有效內容(POST)之間存在足夠的延遲,即套接字將套接字緩衝區中的內容釋放到服務器。這導致HTTP請求被分成兩個分組(分片)。如何防止HttpWebRequest的數據包碎片

當然,這是完全有效的,但是如果數據包被拆分超過大約1.8ms,那麼服務器的另一端就無法處理它。所以我想知道是否有任何現實的方法來控制這個(在客戶端)。

在HttpWebRequest上沒有任何屬性可以控制用於發送的套接字,並且不能訪問套接字本身(即通過反射),因爲它只是在創建期間創建的發送,然後發佈(作爲出站http連接池的一部分)。 BufferWriteStream屬性只是緩存webrequest中的正文內容(所以它仍然可用於重定向等),並且不會影響整個請求寫入套接字的方式。

那該怎麼辦?

(我真的想避免從插座高達重寫HTTP客戶端)

一種選擇可能是寫某種的HttpWebRequest的發送給代理的(也許通過的ServicePoint) ,並在該實現中緩衝整個TCP請求。但是這似乎是一項艱苦的工作。

當我跑步時Fidder酒店(出於同樣的原因),但不是真正的在我們的生產環境中的選項,也能正常工作......

[PS:我知道這是肯定的零碎數據包之間的時間間隔這是問題所在,因爲我敲了一個套接字級測試,在那裏我使用NoDelay套接字明確控制了分段]

+0

你做到完美努力理解這個問題。你唯一忘記的是服務器。它的行爲是不正常的,它必須在超時間隔(大約20-100秒)內接收所有的數據包。因爲它是一個RFC標準。有沒有可能修復服務器? – 2010-02-05 12:20:03

+0

我已經問設備供應商這個問題,但作爲一個嵌入式設備,我懷疑這可能會變得複雜,這就是爲什麼我試圖找到客戶端修補程序。 – piers7 2010-02-07 14:11:27

回答

2

最終供應商推出,其中包括一個固件升級新版本的HTTPD和問題消失了。他們使用的是BusyBox linux,顯然他們遇到了HTTPD實現方面的其他問題。

在我原來的問題,我不認爲有任何這樣做的可靠的方式,除了編寫套接字代理。上面我使用的一些解決方法是靠運氣而不是設計(因爲它們意味着.net一次發送整個數據包)。

0

您的嵌入式服務器是HTTP/1.1服務器嗎?如果是這樣,請在調用GetRequestStream()之前嘗試在webrequest上設置Expect100Continue = false。這將確保HTTP堆棧在發送實體主體之前不期望來自服務器的「HTTP/1.1 100 continue」頭響應。因此,即使數據包仍然會在頭部和主體之間分割,數據包間隔將會縮短。

+0

通過發佈我的請求作爲HTTP 1.0,我已經禁用了(我假設你的意思是將'Expect'頭部清空,因爲請求中沒有明確的Expect100Continue屬性)。 – piers7 2010-02-08 00:04:55

+0

對不起,我的意思是設置ServiecPoint.Expect100Continue = false。 無論如何,我看到你有一個解決方案。但是,我同意以前的評論者,您的服務器的行爲不正確。它不應該要求請求和實體進入相同的數據包。 如果您可以發佈請求/響應的網絡捕獲(Wireshark)(在更改之前),我們可以看到究竟發生了什麼,這可能有助於找出解決方案應該是什麼。 – feroze 2010-02-08 22:49:16

1

什麼具有似乎有固定其上與該URI相關聯的的ServicePoint禁用Nagling的,和發送所述請求作爲HTTP 1.0(均未自己似乎修復它):

var servicePoint = ServicePointManager.FindServicePoint(uri.Uri); 
servicePoint.UseNagleAlgorithm = false; 

然而這似乎仍然只是通過使請求更快地完成而不是強制將標頭和有效負載寫入爲一個數據包。因此,它大概可以加載機/高延遲鏈路上的失敗等

不知道它會怎樣很難寫一個碎片整理代理...

+0

您是否也禁用了Expect100Continue。儘管可能與嵌入式服務器無關,但我已經認識到這兩個屬性受到一些未公開的規則的約束,例如對我來說Epect100Continue = true在某些情況下禁用了naggle算法,儘管該屬性被設置爲true。 另請參閱SupportsPipelining。我懷疑關掉它會立即關閉連接,而不是保持打開狀態,這在嵌入式服務器上可能不是個好主意。 – redcalx 2010-03-05 10:12:51