我试图了解发送给我的全局ASAX OnError处理程序发生了什么错误.
using System;
using System.Web;
namespace GLSS.Components.HttpModules
{
public class ExceptionModule : System.Web.IHttpModule
{
private void OnError(object sender, EventArgs e)
{
HttpContext context = HttpContext.Current;
//get the last error
Exception ex = context.Server.GetLastError();
if(ex.InnerException.GetType().ToString() == "CSLA.DataPortalException")
ex = ex.InnerException;
Run Code Online (Sandbox Code Playgroud)
这是我的Exception转换为String
HttpContext.Current.Server.GetLastError().Message
"File does not exist."
HttpContext.Current.Server.GetLastError().StackTrace
" at System.Web.StaticFileHandler.GetFileInfo(String virtualPathWithPathInfo, String physicalPath, HttpResponse response)
at System.Web.StaticFileHandler.ProcessRequestInternal(HttpContext context)
at System.Web.DefaultHttpHandler.BeginProcessRequest(HttpContext context, AsyncCallback callback, Object state)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)"
Run Code Online (Sandbox Code Playgroud)
如何确定导致此错误的代码行?我试图将我的Debug选项设置为在发生错误时中断,但事实并非如此,我仍然在ONERROR全局处理程序中.
有一件事是我看到代码假定会有一个内部异常,这似乎是NULL并导致处理程序中的第二个错误.
我假设错误发生在编译代码的某处.我检查了Web.Config,并且提到的唯一路径是一个日志路径,这似乎是有效的,并且日志记录似乎正在工作.
更新 我在这里找到了一些其他信息:
当我在立即窗口中检查时:
? HttpContext.Current.Request.Url.ToString()
"http://localhost:2322/favicon.ico"
Run Code Online (Sandbox Code Playgroud)
然而,令我困惑的是,我使用"在文件中查找"搜索我的整个解决方案,寻找favicon.ico,我看不到任何参考.
为什么我看到没有找到图标文件时会出现错误?我猜有些装配正在使用它?但是为什么它在Web根目录中寻找呢?
tpe*_*zek 15
favicon.ico的请求是由大多数现代浏览器盲目地制作的,如果没有favicon(这是正确的行为),他们期望404(File Not Found).您可以在下面找到关于链接类型"icon"的 HTML5工作草案的引用 :
如果没有带有icon关键字的链接,对于通过HTTP或HTTPS获取的文档,用户代理可能会尝试获取并使用带有绝对URL的图标,该图标是通过将URL /favicon.ico解析为文档的地址而获得的,就好像页面使用icon关键字声明了该图标.
您看到异常的原因是配置为使用托管/集成管道模式的Web开发服务器或IIS 通过Global.asax放置所有请求(包括错误).
您可以尝试通过创建以下到favicon的虚拟链接来阻止浏览器发出请求:
<html>
<head>
<link rel="shortcut icon" href="#" />
...
</head>
...
</html>
Run Code Online (Sandbox Code Playgroud)
您也可以尝试以下方法之一:
在RegisterRoutes方法开头添加以下行:
routes.IgnoreRoute("favicon.ico");
甚至更多的扩展版本:
routes.IgnoreRoute("{*favicon}", new {favicon=@"(.*/)?favicon.ico(/.*)?"});
HttpException.GetHttpCode()的404和((System.Web.HttpApplication)Sender).Context.Request.Url用于/favicon.ico.