博客园Blog程序中又一个奇怪问题

来源:互联网 发布:小米wifi放大器网络差 编辑:程序博客网 时间:2024/04/28 03:28
这篇文章中只是描述了我在博客园Blog程序中遇到的问题以及我处理问题的一些想法,并没有提供解决方案,写出来希望能够给感兴趣的朋友一些参考,相然也希望得到一些建议。 : )
     在博客园服务器的应用程序事件日志,每天都有很多这样的警告与错误信息:
     警告:
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 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  
     说明:
     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时发现了非法字符,从而产生异常。
     而让人困惑的是,url怎么会乱码,由客户端浏览器产生的?但怎么出现问题的次数与访问量有关,而且大多数都是产生于对下载文件的访问,而且其中大多数是中文文件名,难道与通配符映射有关,难道是ASP.NET 2.0运行时在处理过程中造成了url乱码?