HTTP 400 BAD REQUEST 非常奇怪的现象

LaPoPvLe 2009-02-09 04:57:34
创建一个UrlHandler处理网页的HTTP请求

namespace Web{
public class UrlHandler : IHttpHandler
{
public bool IsReusable
{ get { return false; } }
public void ProcessRequest(HttpContext context)
{
var url = HttpContext.Current.Request.Url;
var info = string.Format("AbsolutePath:{0}<br/>AbsoluteUri:{1}<br/>", url.AbsolutePath, url.AbsoluteUri);
HttpContext.Current.Response.Write(info);
}
}
}


<httpHandler><add path="*" verb="*" type="Web.UrlHandler,Web" validate="false"/></httpHandlers>

在VS中网站运行正常,但是发布到IIS6/7上时,当请求URL过长时会出现Http 400 Bad Request
ASP.NET detected invalid characters in the URL
测试URL如下
http://localhost/Test/com.ctc_yrd.corp/users/user00001@2009011000001.com/corp.ab.xml/~~/com.ctc_uab.corp/list%5b@name=%226ffda4e6-f085-4f95-a26c-f6278c5ddfe6%22%5d/list%5b@name=%2243df500d-dd7f-44a3-92e5-fa631f4a89ff%22%5d/list%5b@name=%225e0cad9b-0a1d-4ef2-aa50-aa94485ee8a7%22%5d
http://localhost/Test/com.ctc_yrd.corp/users/user00001@2009011000001.com/corp.ab.xml/~~/com.ctc_uab.corp/list%5b@name=%226ffda4e6-f085-4f95-a26c-f6278c5ddfe6%22%5d/list%5b@name=%2243df500d-dd7f-44a3-92e5-fa631f4a89ff%22%5d/list%5b@name=%225e0cad9b-0a1d-4ef2-aa50-aa94485ee8a7%22%5d/list%5b@name=%22493fe883-6876-40bb-a102-b07a8a258886%22%5d

上面的Url请求正确
但是下面的就会出错
...全文
4804 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yzq124391 2009-06-11
  • 打赏
  • 举报
回复
楼里有知道的,和我联系一下呀。
我估计是每台机器默认编码之间的差别,但我的每一个网页都指定了utf8编码了。
yzq124391 2009-06-11
  • 打赏
  • 举报
回复
我也遇到了这样的事。
public void ProcessRequest(HttpContext context)
{

if (null != context.Request.UrlReferrer)
{
string serverDomain = context.Request.Url.Host;
string refDomain = context.Request.UrlReferrer.Host;
//如果域名不相同,提示不要盗链
if (!GetRootDomain(refDomain).Equals(GetRootDomain(serverDomain), StringComparison.OrdinalIgnoreCase))
{
context.Response.ContentType = "text/html";
context.Response.Write(string.Format("请不要盗链。返回<a href='{0}'>{1}</a>", KMKLRequest.GetCurrentFullHost(), "文档管理系统"));
return;
}
else
{

context.Response.ContentType = "application/octet-stream";


if (Cookie.GetCookieUid() != 0 )
{
FileInfo fi = new FileInfo(context.Server.MapPath( Utils.UrlDecode( context.Request.Url.AbsolutePath)));
if (!fi.Exists)
{
fi = new FileInfo(context.Server.MapPath("~/Content/css1/images/CROSS.PNG"));

}
context.Response.TransmitFile(fi.FullName);
}
else
{

context.Response.TransmitFile(new FileInfo(context.Server.MapPath("~/Content/css1/images/DELETE.PNG")).FullName);
}
}
}

}

其中,我要下载的文件url为:http://localhost:29219/Download/3/200961191233_%e6%b5%b7%e5%ba%b7%e5%a8%81%e8%a7%86%26%e7%bd%91%e7%bb%9c%e7%9b%91%e6%8e%a7%e4%b8%ad%e9%97%b4%e4%bb%b6.rar
其中真实文件名为:200961191233_海康威视&网络监控中间件.rar
在迅雷下看到的是:200961191233_海康威视%26网络监控中间件.rar

问题出在这里,我用本地调试 海康威视&网络监控中间件.rar 的文件名(注意&符号)完全没有问题,能够下载。
但是放到服务器上运行。然后用迅雷下:迅雷中显示 404 bad request。
不明白为什么!!!
游北亮 2009-02-11
  • 打赏
  • 举报
回复
invalid characters
可能是url有非法字符,把=后面的值用UrlEncode一下试试
downmoon 2009-02-10
  • 打赏
  • 举报
回复
游北亮 2009-02-10
  • 打赏
  • 举报
回复
根据微软解释,url长度可以是2083
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q208427

你的过长的Url是什么?
没有帖出来啊
LaPoPvLe 2009-02-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 youbl 的回复:]
根据微软解释,url长度可以是2083
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q208427

你的过长的Url是什么?
没有帖出来啊
[/Quote]
字符过长是猜测,问题出在那个URL如果是312个字符时就能识别,多了就会出现BAD REQUEST,并提示ASP.NET detected invalid characters in the URL
LaPoPvLe 2009-02-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wanghao3616 的回复:]
url的长度是255 如果 传递过多的参数可以用session 等其他方法
[/Quote]
我试过在IIS上长度<=312时正确,并且在VS的WEB服务器上并没有这个长度限制.
这又怎么解释啊?
LaPoPvLe 2009-02-09
  • 打赏
  • 举报
回复
我试试
为什么会出现这个现象呢?
wanghao3616 2009-02-09
  • 打赏
  • 举报
回复
url的长度是255 如果 传递过多的参数可以用session 等其他方法
blackmeit 2009-02-09
  • 打赏
  • 举报
回复
get 有长度限制。用post
hy_lihuan 2009-02-09
  • 打赏
  • 举报
回复
使用post传递把

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧