在使用HttpClient默認情況下做POST的時候, HttpClient並不會直接就發起POST請求, 而是會分為倆步,
1.發送一個請求, 包含一個Expect:100-continue, 詢問Server使用願意接受數據,
2.接收到Server返回的100-continue應答以后, 才把數據POST給Server
於是,這樣就有了一個問題, 並不是所有的Server都會正確應答100-continue, 比如lighttpd, 就會返回417 “Expectation Failed”, 則會造成邏輯出錯
Expect:100-Continue握手的目的,是為了允許客戶端在發送請求內容之前,判斷源服務器是否願意接受
請求(基於請求頭部)。
Expect:100-Continue握手需謹慎使用,因為遇到不支持HTTP/1.1協議的服務器或者代理時會引起問題。
而HttpClient 4.0中,是否激活Expect:100-Continue,是由HTTP請求執行參數http.protocol.expect-continue來控制的,通過設置參數值為true或者false,可以相應的激活或者關閉Expect:100-Continue握手。注意,在HttpClient中,默認是激活的。
我們來看看Http1.1協議中關於這個的說明吧。
(100狀態碼(見10.1.1節)的目的在於允許客戶端判定服務器是否願意接受客戶端發來的消息主體(基於請求頭域)在客戶端發送此請求消息主體前。 在有些情況下,如果服務器拒絕查看消息主體,這時客戶端發送消息主體是不合適的或會降低效率。)
其實關鍵就在的Http1.1限制了要先握手,我們這樣想一下,如果我們選擇不握手是不是就行了,當然是可以的。處理方法如下
可以直接在Http請求之前加上這么一句
System.Net.ServicePointManager.Expect100Continue = false //不握手直接請求



