IIS返回响应头Date错误

公司网站测试环境下,用户状态栏登录后无效,我使用日志排查后发现跟Cookie有关,虽然设置了半小时过期,但是服务器返回的响应头里的Date时间不对,导致每次设置的Cookie都过期了。

进一步研究这个问题后发现,每次修改本机时间,都会造成IIS返回的Http Response Header里的Date不再变化,只停留在修改时间的那一刻。这是一个很严重的问题,我以前从来没发现,原来服务器的响应头的时间还有不会变化的情况啊。这应该是IIS的问题,别的服务器我没发现过这种情况。

网上搜索了这种情况的各种描述,终于被我定位到Date header returned by IIS7 is wrong这篇帖子。

原来这是IIS上一个很著名的问题,我个人测试下来,不光是虚拟机上的时间同步,哪怕是本机上调整个时间,都会造成HTTP响应头Date不再变更的错误情况。解决办法是,必须重启HTTP服务。使用管理员身份打开CMD或者PowerShell,执行以下命令即可

1
2
3
net stop http
net start http
iisreset

貌似执行一句net stop http很容易,但是我却费了很大周折。首先第一个错误

发生系统错误 1051。

停止控制被发送到其他正在运行的服务所依赖的服务。

发生这种情况是因为多个服务依赖于http服务,所以必须把这些依赖服务先停止了。如果出现了我上面的错误,可以在运行里执行services.msc进入服务。把和http相关的服务逐个停止。如果你能顺利执行net stop http,那么恭喜你,如果还是报错,那么请接着往下看,第二个错误

服务正在启动或停止中,请稍后片刻后再试一次。

这个错误真的是把我难倒了,尝试了各种方法后依然无果,本以为进行不下去了,在同事的提点下发现,SQL SERVER服务也会占用http服务的,虽然给出的提示里没有,仍旧在服务里把SQL SERVER相关的服务停止一下,看看行不行。有些人可能到这里已经成功了,但是在我的环境下还是不行。

不过在我的坚持不懈下,还是找到了占用http服务的进程,原来我开着Visual Studio在调试网站,虽然我把IIS Express的服务和程序都给关了,但是如果不把Visual Studio整个程序给关闭的话,http服务是无法关闭的,就会出现上面的报错。

关闭了Visual Studio之后,再执行net stop http,整个世界清净了。接下来就是启动http服务以及iis服务了,这里一遍过。最大的难点就是如何关闭http服务。

回想一下,如果不是调整了服务器时间造成Cookie过期,我也不会发现IIS响应头时间的问题。调整时间,对于IIS来说,需要重新启动http服务,否则将造成http响应时间不对的问题。

avatar

chilihotpot

You Are The JavaScript In My HTML