當我們POST數(shù)據(jù)到另一個IIS寄存的Web程式的情況下,
會出現(xiàn):417 Expectation Failed
這個異常源自HTTP1.1協(xié)議的一個規(guī)范: 100(Continue)
100(Continue)狀態(tài)代碼的解釋
允許客戶端發(fā)request消息body之前先用request header試探一下server,看server要不要接收request body,再決定要不要發(fā)request body。
客戶端在Request頭部中包含
Expect:100-continue
Server接到后 如果回100(continue)這個狀態(tài)代碼,客戶端就繼續(xù)發(fā)request body。
早期的Apache就認為這是一種錯誤,而IIS卻可以正確應(yīng)答
這個設(shè)置是Http1.1才有。
解決辦法:
向Header添加Expect:100-continue,如:
request.Headers.Add( "Expect" , "100-continue" );
|
asp.net下:
System.Net.ServicePointManager.Expect100Continue = false ;
|
或者在IIS網(wǎng)站根目錄下找到文件web.config,添加配置:
<system.net>
<settings>
<servicePointManager expect100Continue="false" />
</settings>
</system.net>
轉(zhuǎn)自https://www.cnblogs.com/newmin/archive/2011/02/23/1962480.html
以下為微軟文檔解釋。
注解
當此屬性設(shè)置為 true
時,將使用 100-Continue 行為。 如果 Expect100Continue 屬性為 true
ContentLength 且 屬性大于零或?qū)傩詾?true,則使用 PUT
和 POST
方法的SendChunked客戶端請求將向請求添加一個 Expect 標頭。 客戶端預(yù)期會收到來自服務(wù)器的 100-Continue 響應(yīng),以指示客戶端應(yīng)發(fā)送要發(fā)布的數(shù)據(jù)。 當服務(wù)器根據(jù)請求標頭拒絕請求時,此機制允許客戶端避免通過網(wǎng)絡(luò)發(fā)送大量數(shù)據(jù)。
例如,假定 Expect100Continue 屬性為 false
。 將請求發(fā)送到服務(wù)器時,它包括數(shù)據(jù)。 如果在讀取請求標頭后,服務(wù)器需要身份驗證并且必須發(fā)送 401 響應(yīng),則客戶端必須使用正確的身份驗證標頭重新發(fā)送數(shù)據(jù)。
如果此屬性為 true
,則請求標頭將發(fā)送到服務(wù)器。 如果服務(wù)器未拒絕請求,則會發(fā)送 100-Continue 響應(yīng),指示可以傳輸數(shù)據(jù)。 如果服務(wù)器需要身份驗證,如前面的示例所示,它會發(fā)送 401 響應(yīng),并且客戶端未不必要地傳輸數(shù)據(jù)。
更改此屬性的值不會影響現(xiàn)有 ServicePoint 對象。 只有更改后創(chuàng)建的新 ServicePoint 對象才會受到影響。
100-Continue 行為不用于 HTTP 1.0 請求,即使此屬性設(shè)置為 true
。
該文章在 2024/7/23 9:52:26 編輯過