HTTP 400 错误请求
http400错误请求很多时候都不是网站问题,而是系统出错,只是系统不承认。有可能是病毒引起的,也可能是安装的某些软件引起的。方法一:网页工具选项里有个Internet选项,在常规选项卡里点删除cookies,隐私级别调至最高 这种方法在开始时候还管事,但是后来不仅不好用而且需要登录的网页只能把隐私级别调回来再登陆。但是这种方法是最简单最安全的,隐私级别调高是为了以后不在出现类似问题,不过有些原因引起的这种方法不管用。方法二:删除c\windows\system32\wbem\repository中的文件,有一个文件夹删不了,不用管它,然后重启。这种方法不能彻底解决,以后可能还会出现类似问题,出现之后按上述步骤仍可解决。方法三:在开始\运行下依次运行以下命令regsvr32 actxprxydll
regsvr32 shdocvwdll
如果不行继续运行下面的命令
regsvr32 mshtmldll
regsvr32 urlmondll
regsvr32 msjavadll(这个运行时候可能会出现提示说不存在模块,这样就需要下载一个dll模块,地址 http://wwwdll-filescom/dllindex/dll-filesshtmlmsjava 是个英文网站,下载地址在下面,下载后查毒,解压到system32里)
regsvr32 browseuidll
前段时间出差,在北京现场遇到一个F5网络不通问题,现记录下来以备后面查阅。
问题解决方案很简单,主要记录下排查过程中的思路。
现场环境是使用F5做负载均衡,即F5对外提供服务地址和端口,F5负载转发请求到后端业务服务器。环境是客户的测试环境,F5也是客户的。我们向客户提交F5转发策略和F5健康检查策略,等待网络开通。本来以为不用担心这一块问题,但客户的网络部门配置完成后,网络一直不通。由于未接触过F5所以前面不知怎么和客户沟通,后拿到F5账号和密码,登录进去后开始定位问题。
进去F5登录界面后,看到配置的转发策略中,后端服务器健康检查是失效的,即F5认为后端服务器不在线。这是怎么回事?
这里首先弄清F5健康检查规则是怎么回事?
F5健康检查规则是指F5在一定周期内向后端服务器发送请求来确认后端服务器是否在线。
如下图:
图中 Send String 就是 F5发送的请求字段, Receive String 是F5接收到响应后对比字段,只要响应中有对比字段则认为成功。Receive String为空时,F5接收到响应就认为成功。
继续排查F5健康检查失效问题。
问题主要在两点:1 发送请求字段写的有问题。2接收的响应中没有包含200 OK,匹配不上。
上述这两点通过抓包可以分析。因为现场没法登陆F5服务器上去抓包,下面就利用nc工具模拟F5发请求。
nc 全名 Netcat (网络刀),是一个强大的网络工具,可以模拟发送http请求。
下面在和业务服务器同网段的任意一台服务器上装上nc 工具。
然后使用nc 命令发送请求,请求如下:
引号中的请求字段和F5中sendString一致。
利用nc 发送http请求后,得到的响应如下:
把得到的结果复制到一个html文件中,然后打开如下:
现在F5健康检查问题找到了:是因为业务服务器返回400错误,但F5匹配200 OK, 没有匹配上造成F5认为服务器有问题。
继续看问题,nginx为啥会返回错误码400?
这也是本片文章重头戏。
网上查询原因如下:Nginx官方文档介绍,400状态码含义如下:
上面是http11的rfc关于host部分的解释,从上面我们了解到如果一个http11的请求没有host域,那么server应该给client段发送400的状态码,表明这个请求server不能处理。而对于Nginx server来说,也遵循这样的方式,说明client发送了一个无效的请求,Nginx server无法处理,于是返回了400的状态码。
本次故障中,客户端的调用方式没有使用host 参数,传递了空的Host头给服务端,一旦Nginx设置了proxy_set_header Host $http_host,空Host头就传给了后端。然而,在http 11的规范中,Host只要出现空,就会返回400,所以出现了这个故障。
最后,重新修改发送规则如下:这里HOST随便写一个地址就可以。
利用nc 命令测试,结果如下:
F5修改发送规则后,终于网路联通了,如下图:
至此,问题解决。
jmeter 报Response code: 400 的错误,要检查下post接口的请求头是否完善;添加信息头(Header)如下图所示
做接口测试发现postman请求接口返回正常,但是jmeter出现415请求不通:The server refused this
request because the request entity is in a format not supported by the
requested resource for the requested method
在查看结果树中看到:
Request Headers:
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 27
User-Agent: Jakarta Commons-HttpClient/31
这里的Content-Type: application/x-www-form-urlencoded方式是Jquery的Ajax请求默认方式,这有可能导致向服务器发送数据不成功;因为http服务发送的post请求认是json数据格式所以数据接收不到;
在HTTP信息头管理器将Content-Type修改为:application/json告诉服务器请求的主题内容是json格式的字符串,服务器端会对json字符串进行解析;
Get方法可以正常返回值,POST方法提示:远程服务器返回错误: (400) 错误的请求。
服务端代码如下:
[ServiceContract] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsModeAllowed)] [ServiceBehavior(InstanceContextMode = InstanceContextModePerCall)] public class RestService { [WebInvoke(UriTemplate = "Create", Method = "POST")] public string Create(string s) { return s; } [WebGet(UriTemplate = "Getid={id}",RequestFormat = WebMessageFormatJson)] public SampleItem Get(string id) { return new SampleItem {Id = 1, StringValue = "http://syanghaoorg/program/test"}; } }
客户端调用代码如下:
WebClient webClient = new WebClient();webClientEncoding = SystemTextEncodingUTF8;webClientHeaders[HttpRequestHeaderContentType] = "application/json";string tt = webClientDownloadString("http://localhost:7000/RestService/Getid=tt");ConsoleWriteLine(tt);WebClient client=new WebClient();clientEncoding = SystemTextEncodingUTF8;clientHeaders[HttpRequestHeaderContentType] = "application/json";//下一行报错clientUploadString(new Uri("http://localhost:7000/RestService/Create", UriKindAbsolute), "POST", "test");
次浏览
最近遇到的坑,后台返回的token和filename都没有问题,上传还是报code400,最后发现是因为后端申请七牛云的时候填写的服务器是华南区 而SDK里默认是华东区,导致上传失败。
步骤一:先搜索七牛SDK里的zone0(图一)
步骤二:查看后台申请的区域(图三)
步骤三:把(图二)中的zone2改成你对应的服务区区域。因为我是华南服务器,所以调用了zone2
0条评论