gpt4 book ai didi

c# - 收到错误 400/404 - HttpUtility.UrlEncode 未对完整字符串进行编码?

转载 作者:太空狗 更新时间:2023-10-29 19:40:02 32 4
gpt4 key购买 nike

为什么以下 URL 会给我以下 IIS 错误:

A) http://192.168.1.96/cms/View.aspx/Show/Small+test '

A2) http://192.168.1.96/cms/View.aspx/Show/Small%20test ' <-- 这有效,但不是 HttpUtility.UrlEncode() 的结果

B) http://192.168.1.96/cms/View.aspx/Show/ '%26$%23funky**!!~''+页面

A 的错误:

HTTP Error 404.11 - Not Found
The request filtering module is configured to deny a request that contains a double escape sequence.

B 的错误:

HTTP Error 400.0 - Bad Request
ASP.NET detected invalid characters in the URL.

/Show/之后的 URL 的最后一部分是通过 HttpUtility.UrlEncode() 发送文本后的结果,因此根据 Microsoft 的说法,它是正确编码的 URL。

如果我使用 HttpUtility.UrlPathEncode() 而不是 HttpUtility.UrlEncode() 我会得到 A2 结果。但是 B 最终看起来像:

http://192.168.1.96/TVCMS-CVJZ/cms/View.aspx/Show/ '&$#funky**!!~''%20页

仍然是错误的。 Microsoft 完全知道如何进行 URL 编码吗?是否有人编写了一个函数来以正确的方式执行此操作?

编辑:

我已经编写了自己的编码器:

static public string UrlEncode(string encode)
{
if (encode == null) return null;
string encoded = "";

foreach (char c in encode)
{
int val = (int)c;
if ((val >= 48 && val <= 57) || (val >= 65 && val <= 90) || (val >= 97 && val <= 122))
encoded += c;
else
encoded += "%" + val.ToString("X");
}

return encoded;
}

该函数适用于上面的 A2,B 的结果是:

http://192.168.1.96/cms/View.aspx/Show/%27%26%24%23funky%2A%2A%21%21~%27%27%20page

但即使这看起来像一个不错的有效 URL IIS 仍然给我一个

HTTP 错误 400.0 - 错误请求ASP.NET 在 URL 中检测到无效字符。

最佳答案

好的,回答我自己的问题...讨厌这样做,但经过大量挖掘后我得到了答案。

http://www.lostechies.com/blogs/joshuaflanagan/archive/2009/04/27/asp-net-400-bad-request-with-restricted-characters.aspx

总而言之,微软在其所有的荣耀中决定不再坚持国际标准。

%、&、* 或 : 不能在 URL 中,在 ? 之前编码或解码出于任何原因。

为了解决这个问题,我编写了自己的编码和解码:

static public string UrlEncode(string encode)
{
if (encode == null) return null;
string encoded = "";

foreach (char c in encode)
{
int val = (int)c;
if (val == 32 || val == 45 || (val >= 48 && val <= 57) || (val >= 65 && val <= 90) || (val >= 97 && val <= 122))
encoded += c;
else
encoded += "%" + val.ToString("X");
}

// Fix MS BS
encoded = encoded.Replace("%25", "-25").Replace("%2A", "-2A").Replace("%26", "-26").Replace("%3A", "-3A");

return encoded;
}

static public string UrlDecode(string decode)
{
if (decode == null) return null;
// Fix MS BS
decode = decode.Replace("-25", "%25").Replace("-2A", "%2A").Replace("-26", "%26").Replace("-3A", "%3A");

return HttpUtility.UrlDecode(decode);
}

目前这两个函数都不是 Unicode 友好的,但现在它可以工作。

关于c# - 收到错误 400/404 - HttpUtility.UrlEncode 未对完整字符串进行编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4599940/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com