在博客园服务器的应用程序事件日志,每天都有很多这样的警告与错误信息:
警告:
Event Type: Warning
Event Source: ASP.NET 2.0.50727.0
Event ID: 1073
Description:
Failed to process request.
Exception: System.Web.HttpException
Message: '/files/test/绠€鍗曠粨鏋勭ず鎰忓浘锛堝叚锛?jpg' is not a valid virtual path.
StackTrace: at System.Web.VirtualPath.Create(String virtualPath, VirtualPathOptions options)
at System.Web.HttpRequest.get_FilePathObject()
at System.Web.Security.CookielessHelperClass.RemoveCookielessValuesFromPath()
at System.Web.HttpContext.Init(HttpRequest request, HttpResponse response)
at System.Web.HttpContext..ctor(HttpWorkerRequest wr, Boolean initResponseWriter)
at System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr)
at System.Web.HttpRuntime.ProcessRequestNoDemand(HttpWorkerRequest wr)
at System.Web.Hosting.ISAPIRuntime.ProcessRequest(IntPtr ecb, Int32 iWRType)
错误:
Event Source: ASP.NET 2.0.50727.0
Event ID: 1073
Description:
Failed to process request.
Exception: System.Web.HttpException
Message: '/files/test/绠€鍗曠粨鏋勭ず鎰忓浘锛堝叚锛?jpg' is not a valid virtual path.
StackTrace: at System.Web.VirtualPath.Create(String virtualPath, VirtualPathOptions options)
at System.Web.HttpRequest.get_FilePathObject()
at System.Web.Security.CookielessHelperClass.RemoveCookielessValuesFromPath()
at System.Web.HttpContext.Init(HttpRequest request, HttpResponse response)
at System.Web.HttpContext..ctor(HttpWorkerRequest wr, Boolean initResponseWriter)
at System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr)
at System.Web.HttpRuntime.ProcessRequestNoDemand(HttpWorkerRequest wr)
at System.Web.Hosting.ISAPIRuntime.ProcessRequest(IntPtr ecb, Int32 iWRType)
Event Type: Error
Event Source: ASP.NET 2.0.50727.0
Event ID: 1091
Description:
Failed to execute request due to unknown error. Error: 0x80004005 Unspecified error
说明:Event Source: ASP.NET 2.0.50727.0
Event ID: 1091
Description:
Failed to execute request due to unknown error. Error: 0x80004005 Unspecified error
1、在日志中,上面的警告信息先被记录,两个信息记录的时间在同一秒。
2、在访问高峰期,每几分钟就会出现,也就是这个问题与ASP.NET2.0 运行时的负荷有关,ASP.NET2.0运行时太忙、太累的时候就容易出错。
3、这两事件都是一起出现,说明是关联的,是由同一个原因引起的。
4、从警告信息中可以看出,这个问题是url乱码引起的。
对于这个问题,我觉得首先找到问题发生的地方是必要的,从警告信息中我们可以看出问题发生在VirtalPath中,VirtalPath是ASP.NET 2.0中一个很重要的类,只要与虚拟路径相关的操作,多多少少都会与VirtalPath有联系,遗憾的是这个类被internal保护,不能直接调用,不然在开发ASP.NET 2.0应用 程序时会很有帮助。(题外话:既然Reflector可以反编译源代码,通过反射也能调用,我觉得微软没必要用internal将那很多有用的类保护起来,开放出来,可以帮助.NET开发人员。)
根据警告信息,用Reflector查看VirtalPath.Create(string virtualPath, VirtualPathOptions options)的代码,找出警告产生的源头,根据我的分析,应该是在下面的代码中产生的:
if (virtualPath.IndexOfAny(VirtualPath.s_illegalVirtualPathChars) >= 0)
{
throw new HttpException(SR.GetString("Invalid_vpath", new object[] { virtualPath }));
}
由于url出现乱码,上面的代码在处理url时发现了非法字符,从而产生异常。{
throw new HttpException(SR.GetString("Invalid_vpath", new object[] { virtualPath }));
}
而让人困惑的是,url怎么会乱码,由客户端浏览器产生的?但怎么出现问题的次数与访问量有关,而且大多数都是产生于对下载文件的访问,而且其中大多数是中文文件名,难道与通配符映射有关,难道是ASP.NET 2.0运行时在处理过程中造成了url乱码?