我有一个ASP.NET Core Web API,并且在查询参数中存在编码URL的问题。
我有一个像'path / to /'这样的网址参数。 IDENTIFIER部分类似于'HÄÄ/ 20/19'。这是在前端urlEncoded到链接URL。结果是像
这样的链接domain.com/new/stuff/path/to/H%C3%84%C3%84%2F20%2F19
现在,在某些时候,用户被重定向到控制器,其中此URL用于查询参数,如:
param=%2Fpath%2Fto%2FH%C3%84%C3%84%2F20%2F19
我正在使用请求查询来获取参数
var param = HttpContext.Request.Query["param"].ToString();
在此之后,param的值为
%2Fpath%2Fto%2FHÄÄ%2F20%2F19
所以带有DIAERESIS的拉丁文大写字母A会被自动解码,因为其他编码字符不是。
当我将用户重定向到此URL时,会出现实际问题。它以引用标头结束,它会导致严重错误消息
System.InvalidOperationException:标头中的非ASCII或控制字符无效:0x00C4
我试图用'A'替换所有'Ä'字符,问题得到解决。这不是一个真正的解决方案。我不能编码整个变量(见上文),因为它会导致其他编码字符的双重编码。
此问题仅发生在IE11和Edge(AFAIK)上,并且至少可以与Chrome一起使用。
我不是100%确定实际问题在哪里以及为什么会发生这种情况所以任何人都有任何想法从哪里开始寻找以及如何解决这个问题而不用黑客攻击string.replace?
修改
我可以用这样的东西修复它,但我并不认真这样做。似乎方式太hacky。
var problemPart = param.Substring(param.LastIndexOf('/') + 1, param.Length - param.LastIndexOf('/') - 1);
var fixedPart = WebUtility.UrlDecode(problemPart);
fixedPart = WebUtility.UrlEncode(fixedPart);
param = param.Replace(problemPart, fixedPart);
编辑2
我认为问题是当URL结束到referer头时,IE11和Edge通过向其添加控制字符来更改编码。我添加到原始帖子的修复程序实际上并没有解决问题但只是解决它。添加到URL的控制字符是%C2%84(因此Ä变为%C3%84%C2%84而不仅仅是%C3%84)
临时办公室
我基本上使用上面的代码来解决这个问题。我迭代了参数值并重新编码了其中的所有无效字符。这不能解决根本原因,但可以解决问题并且用户不会在屏幕上出现任何错误。