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