关于HTTP请求返回417 “Expectation Failed”

在使用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 //不握手直接请求

时间: 2025-01-17 07:54:16

关于HTTP请求返回417 “Expectation Failed”的相关文章

visual studio 远程服务器返回了意外响应:(417)expectation failed

解决方法: 修改devenv.exe.config文件,添加 <servicePointManager expect100Continue="false" /> C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\devenv.exe.config <system.net>        <settings>            <ipv6 enabled="

php curl报错:417 - Expectation Failed

当我在post提交的数据增加一段内容后会报错:417 - Expectation Failed. 查资料发现在使用curl做POST时,当post的数据大于1024字节时,curl并不会直接发起post请求,而是分为两步, 1.发送一个请求,包含一个Exc:100-continue,询问Server接收数据 2.接收到Server返回100-continue应答后,才把post提交给Server RFC相关资料:https://www.w3.org/Protocols/rfc2616/rfc26

接口请求返回状态码总结

接口请求返回状态码总结 前端在调用接口时都要关注接口返回给我们的状态码,之前只是大概的了解比如404是前端的错,可能是路径错误等,300+可能是重定向了,500以上是服务端或者服务器的错误,并没有一个很好的总结.今天中午看群里有人问这问题,就搜集对比整理了一下,如下: 1xx - 信息提示 这些状态代码表示临时的响应.客户端在收到常规响应之前,应准备接收一个或多个 1xx 响应.· 100 - Continue 初始的请求已经接受,客户应当继续发送请求的其余部分.· 101 - Switchin

对GET/POST请求返回cookie中的键值对进行重新组合

get/post请求返回的cookie中并不是所有的键值对我们都需要,我们只需要提取我们需要的进行重新组合就可以了. 如下图是一个GET请求返回的cookie 我需要提取其中的 uin,skey等相关键值对. 以下函数可以完成我们的需要: //using System.Text.RegularExpressions; public string GetCookieByName(List<string> keylist, string cookie) { string str = "&

ajax请求返回数据,模板中的数据处理

/*ajax请求返回数据,模板中的数据处理*/ function QueryGameAsset(){ var new_start_time=$('#new_start_time').val();//开始时间 var new_end_time=$('#new_end_time').val();//结束时间 if(!new_start_time||!new_end_time){ alert("时间不能为空"); return false; } $.ajax({ url:'/Statisti

swift http请求返回json数据并解析

1 AppDelegate.swift // // AppDelegate.swift // QQDemo // // Created by 赵超 on 14-6-21. // Copyright (c) 2014年 赵超. All rights reserved. // import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? fun

根据URL请求 返回XML字符串

public static string GetHttpResponse(string url) { string content = ""; // Create a new HttpWebRequest object.Make sure that // a default proxy is set if you are behind a fure wall. //其中,HttpWebRequest实例不使用HttpWebRequest的构造函数来创建,二是使用WebRequest的C

ionic 发送请求返回一直都是404

在web端调试一直都没有问题,生成app之后发现所有的请求返回的都是404, 断掉wifi和4G之后发送的也是404 原因是未引入插件 解决方法 http://stackoverflow.com/questions/30060534/ajax-requests-fail-after-upgrading-to-cordova-5-0-cordova-android4-0

GET方式的HTTP请求,返回响应体

public static readonly string DefaultUserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"; /// <summary> /// GET方式的HTTP请求 /// </summary> /// <param name="targetUri">&