今天将图片服务切到使用了cdn的机器上面去,然后就部分图片报如下图错误“HTTP Error 400. The request URL is invalid”
看到这种错误信息,一般的开发者心中可能会猜测到两个原因
1.链接中有特殊字符
2.链接长度过长(似乎长度过长也不是这个错,模糊不清,忘记了)
错误图片的地址如下:http://{host}/SearchService.svc/rest/pic600x320/png/kv3hcxmnCmISVvFKojNBGpkN44MRx71vV4v7Qu7ikclbic2vX5Axnm8RxwhLoWyehsSz4J%C2%A72F6h4eQgvkrbzuKGR6y7sszK1KUY75RqxylZMumapwVQttfllaSPXwoRGEeVexDqjmMZSERPquL3uLZbv6Vxdx52nRDUW90SVVYeqkHZbx2w3T1coqt2v036tfaZ%C2%A72D8GBlPbIVJuhSFU5GA8116z8FkV4%C2%A72kDtsxSXy9XTFIziTToRpbQEkp7497O6q99
接下来就开始了按照我们所能遇见的错误原因进行排查
1.查看url,并没有特殊字符(排除这个原因)
2.url咋一看确实很长,那我们删除参数的一半长度再请求。结果是可以成功,然后通过不断的加字符,发现长度超过339就报这个错,而339后面也没啥特殊字符,所以我们基本确定错误原因是因为url过长。
接下来就是解决相关问题
然后就是各种百度,查看相关修改querystring长度限制的配置
然后就修改web.config
1.修改 httpRuntime 节点下面增加 maxQueryStringLength,maxRequestLength配置
<httpRuntime requestPathInvalidCharacters="" requestValidationMode="2.0" maxQueryStringLength="2097151" maxUrlLength="2097151" maxRequestLength="2097151" relaxedUrlToFileSystemMapping="true" executionTimeout="36000" delayNotificationTimeout="36000" />
2.修改system.webServer节点,如下
security> <requestFiltering allowDoubleEscaping="true" allowHighBitCharacters="true" > <requestLimits maxAllowedContentLength="2097151" maxQueryString="2097151" maxUrl="2097151" /> requestFiltering> security>
满怀期待的保存,运行,错误依旧,好像并没有什么卵用
这个时候就开始纳闷了,为啥不行,会不会没有生效,想到这儿可能就有很多人像我一样,想到了iis的全局设置,会不会该项设置不能被覆盖,我们用的依旧是全部设置的值
不用猜测,查看一下就知道了(注意,查看的requestFiltering是位于 system.webServer下,不要看错节点了)
<section name="requestFiltering" overrideModeDefault="Allow" />
如果是关闭的,overrideModeDefault的值是Deny,Allow表示我们该配置会以我们站点具体配置为准。
那么一切都是正常的啊,为啥就是报错呢?!
最后stackoverflow上面一个没有被采纳的回答引起了我的注意
链接 https://stackoverflow.com/questions/8447698/the-request-url-is-invalid-in-iis-7
大致意思是,请求还没到iis,被操作系统干掉了。
这个时候在google上面搜到另外一篇文章,链接到了微软的光放技术支持
地址如下 https://support.microsoft.com/zh-cn/help/820129/http-sys-registry-settings-for-windows
两篇文章的大意都是我们需要修改注册表,综合两篇文章,大概修改是注册表如下两个值
接下来就试一下,进入注册表 CMD =》 regedit=》HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters
右击空白区域,选择Dword值,如图
新建名称 UrlSegmentMaxLength,值设置成2048,然后点击ok