問題描述:
.net 發(fā)送http 請(qǐng)求 采用兩種方式(httpclient/ HttpWebRequest),
對(duì)方接口 是采用java 搭建的服務(wù)器,
但在訪問接口 時(shí) ,總是得不到 響應(yīng)。 但是采用postman 的 話 又可以得到響應(yīng)結(jié)果。
于是采用fiddler 進(jìn)行 http 請(qǐng)求抓包。 對(duì)比 兩個(gè) 請(qǐng)求的 請(qǐng)求頭信息。
發(fā)現(xiàn) postman 中沒有 Expect:100-continue 這個(gè)請(qǐng)求頭 ,但是 自己的 發(fā)起的請(qǐng)求中帶有這個(gè)。
于是 關(guān)閉掉 這個(gè)請(qǐng)求頭
(httpwebrequest: myRequest.ServicePoint.Expect100Continue = false;)
(httpclient: httpClient.DefaultRequestHeaders.ExpectContinue = false;)
然后重新 發(fā)起請(qǐng)求,然后 就獲得到了 響應(yīng)
(說明:請(qǐng)求數(shù)據(jù)只有207 字節(jié),采用post方式)
于是在網(wǎng)上查找 Expect:100-continue 作用是什么:
它可以讓客戶端在發(fā)送請(qǐng)求數(shù)據(jù)之前去判斷服務(wù)器是否愿意接收該數(shù)據(jù),如果服務(wù)器愿意接收,客戶端才會(huì)真正發(fā)送數(shù)據(jù),這么做的原因是如果客戶端直接發(fā)送請(qǐng)求數(shù)據(jù),但是服務(wù)器又將該請(qǐng)求拒絕的話,這種行為將帶來很大的資源開銷。所以為了避免這種情況,libcurl在發(fā)送大于1024字節(jié)的POST請(qǐng)求時(shí)采用了這種方法,但是相對(duì)的,它會(huì)引起請(qǐng)求延遲的加大,另外并不是所有的server都會(huì)正確處理并且應(yīng)答”100-continue“,比如lighttpd,就會(huì)返回417”Expectation Failed“,造成請(qǐng)求邏輯出錯(cuò)。
如果確定服務(wù)器不會(huì)拒絕1024個(gè)字節(jié)以上的POST請(qǐng)求,就可以不使用該方法而且也可以避免以上提到的兩個(gè)副作用。
特此 記錄該問題。