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