我有一个基本的ASP.NET MVC2站点,每次加载视图(非部分视图)时都会记录单个“文件不存在”错误。我很确定这是因为我从主页面引用了一个不存在的文件,但我无法弄清楚它是哪一个。
堆栈跟踪没用(见下文)。有没有人有关于如何最好地调试这个的提示?
File does not exist. : 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)
答案 0 :(得分:55)
正如您所说,它可能是您的母版页引用的丢失文件或图像。要捕获错误,请将以下错误处理程序添加到Global.asax
protected void Application_Error(object sender, EventArgs e)
{
Exception ex = Server.GetLastError();
if (ex.Message == "File does not exist.")
{
throw new Exception(string.Format("{0} {1}", ex.Message, HttpContext.Current.Request.Url.ToString()), ex);
}
}
然后,这应该告诉您页面请求的资源
答案 1 :(得分:5)
或者,如果调试,您可以将以下行放在立即窗口中以检查:
? HttpContext.Current.Request.Url.ToString()
答案 2 :(得分:2)
检查CSS文件中的url(resource_path),其中“resource_path”不存在。
我得到了同样的例外。发现问题出现在CSS文件中,项目中缺少图像文件而文件系统中没有。例如,一行:
background-image: url( /images/foo.png );
图片文件夹中没有“foo.png”文件。
您可以将最后一个异常转换为HttpException以获取HTML状态代码:
HttpException httpEx = Server.GetLastError() as HttpException;
if( httpEx != null )
httpEx.GetHttpCode(); // Will be HTML status code, 404 in this case.
但它不包含任何缺少文件的信息。我发现丢失的文件是通过检查页面上的每个CSS类声明发生了这个错误。
答案 3 :(得分:1)
在Global.asax
文件
protected void Application_Error(object sender, EventArgs e)
{
Exception ex = Server.GetLastError();
Log.Error("An error occurred", ex);
Log.Error("Requested url: ", Request.RawUrl);
}
Request.RawUrl
提供给出错误的确切网址。
现在在您的日志文件中,您应该看到:
Requested url: /favicon.ico
答案 4 :(得分:0)
在我的情况下,我得到了同样的错误,虽然我没有在浏览器控制台中找到任何“404错误”。我甚至检查了主文件,找不到任何文件丢失。 事实证明,浏览器希望favicon.ico成为网站的根源。 我在我的网站的根目录创建了一个favicon.ico,问题就消失了。 这是一个生成图标的好网站:http://www.favicon.cc/
答案 5 :(得分:0)
在我的情况下,它是一个缺少的默认主页,即default.aspx是罪魁祸首。
因此添加default.aspx文件解决了这个问题。
但是,此项目不需要默认页面,因为它不是面向项目的用户。
通过网络连接遗留系统更像是一个中间件应用程序。