如何修复 ASP.NET 错误“文件'nnn.aspx'尚未预编译,无法请求。”?

Posted

技术标签:

【中文标题】如何修复 ASP.NET 错误“文件\'nnn.aspx\'尚未预编译,无法请求。”?【英文标题】:How to fix ASP.NET error "The file 'nnn.aspx' has not been pre-compiled, and cannot be requested."?如何修复 ASP.NET 错误“文件'nnn.aspx'尚未预编译,无法请求。”? 【发布时间】:2010-10-10 18:26:45 【问题描述】:

我有一个使用“发布网站”发布的 VS 2005 网站,我清除了所有三个复选框。我还有一个部署项目,可以获取已发布的文件并创建一个 MSI。然后我将包安装在单独的测试服务器上。

换句话说,整个网站都是预编译的。但是,当我转到名为“Services”的特定子文件夹中的任何 .aspx 文件时,我得到一个 HttpException:

System.Web.HttpException:文件“/myapp/Services/mypage.aspx”尚未预编译,无法请求。

如果我转到其他文件夹中的 .aspx 文件,无论是根文件夹还是其他子文件夹,它都能正常工作。

mypage.aspx 本身的内容是:<%@ Page Language="C#" AutoEventWireup="true" CodeFile="mypage.aspx.cs" Inherits="Services_mypage" %>"

/myapp/bin 文件夹中,我可以看到一个mypage.aspx.989dc2fb.compiled 文件。 this 的内容似乎指向了 bin 文件夹中也存在的某个程序集。

为什么会出现这个错误? .compiled 文件在那里,程序集在那里,并且该程序集中存在相关类型(我可以在对象浏览器中看到它)。与 .compiled 文件的名称或内容有关吗?我有错误的版本吗? .compiled 文件名中看似随机的数字是什么意思,是否重要?

我还想提一下,这个问题是突然出现的,由于几天前它工作正常,我不确定可以进行哪些更改(但据我所知,没有)。

【问题讨论】:

如果以前可以正常工作,但突然收到此错误消息,请尝试在 ApplicationPool 的高级选项中将“启用 32 位应用程序”设置为 True。 【参考方案1】:

这个问题可能是由许多不同的原因引起的。 我的页面是零星的,醒了一会儿,突然给出了提到的错误。 这是一个与内存压力相关的问题this thread 为我提供了正确答案,我也在那里发布了我的解决方法。

【讨论】:

【参考方案2】:

如果您在运行 MSBuild 脚本时收到此错误,则很可能您的项目是 2.0 或 3.5 项目,并且 MSBuild 使用的是 4.0 编译器。尝试添加:

TargetFrameworkMoniker="3.5"

到您的 AspNetCompiler 指令。

【讨论】:

【参考方案3】:

我遇到了同样的问题。我的问题已通过删除此文件夹中的临时 asp.net 文件夹中的文件得到解决:

C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root 

【讨论】:

我们也遇到了同样的错误,这个解决方案为我们解决了这个问题。我们有 24 台 Web 服务器,它们都运行相同的代码库,一些显示此错误,而另一些则没有。我们清除了所有 Web 服务器上的这个文件夹,问题就消失了。【参考方案4】:

这是 VS 2008 的解决方案。

请勾选如下所示的框以解决问题。

【讨论】:

【参考方案5】:

在我的情况下,“nnn.aspx.xxxxxxxx.compiled”文件已被 WebDeploy 删除,因为我在同一个 Jenkins 工作区中同时运行了 2 个作业。第二个作业在 WebDeploy 包创建期间删除了一些文件。

【讨论】:

【参考方案6】:

我今天也遇到了同样的问题。一些论坛告诉您的网站缺少参考,在您的情况下确实如此。尽管您已经包含了所有必要的程序集,但您可能已经将您的网站部署在具有 3.5 框架的 IIS 服务器中,对吧?

这是我的情况,所以我从原始 ASPX 3.5 网站复制了 web.config 文件并修改了一些部分(删除了其他 3.5 程序集引用)并尝试再次部署它。

【讨论】:

【参考方案7】:

如果您在 bin 中有一个不再属于项目一部分的页面的 .compiled 文件,也会发生此错误。您基本上会收到这个代替 404。删除 .compiled 文件,然后得到 404。

【讨论】:

【参考方案8】:

我没有遇到这个错误,但是在谷歌上搜索了一下之后,我发现了这个链接,我不确定你是否已经看到它:http://forums.asp.net/t/956297.aspx

编辑(添加关键文本):

当在 web.config 中指定引用并且部署文件夹/站点不包含系统中安装的这些 dll 或 bin 文件夹不包含它们(如果它们是私有程序集)时,将出现此错误。 例如:(添加 assembly="Namespace1.NameSpace2, Version=x.x.x.x, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/) 如果您的 web.config 包含任何这样的程序集,并且部署的服务器在 bin 或 GAC 中不包含这些程序集,则会发生此错误。

人们报告说,在他们的案例中,目标服务器上缺少程序集最终是根本原因,但他们遇到了与您相同的错误。很奇怪。

也许这就是问题所在?

【讨论】:

+1 来自我的提示。原来我们缺少一个控制程序集。 对我来说略有不同,但 dll 主题相同。我有一个项目 A,它生成了一个带有一些在项目 B 中使用的预编译用户控件的 dll。这两个项目都使用了 Telerik RadControls,但版本不同。项目 B 中没有使用来自 A 的控件的页面有效,那些确实给出了关于版本不匹配的适当消息。然后 B 中的 .asmx 服务给出了非常无用的未预编译消息。同步版本修复了这一切。 该网站部分为我工作。已验证所有文件计数与我之前的构建相同。删除 PrecompiledApp.config 实际上使所有 aspx 都显示它是已编译页面的标记文本的消息。项目的完全重新编译对我有用。现在一切正常。 在我的情况下,我缺少 Microsoft.ReportViewer.Common、Microsoft.ReportViewer.ProcessingObjectModel、Microsoft.ReportViewer.WebForms、Microsoft.ReportViewer.WinForms、Microsoft.SqlServer.Types 程序集【参考方案9】:

对我来说,我有一个脚本可以删除生产文件夹,然后复制新文件。

脚本未能正确删除生产文件夹,导致新旧文件混合在一起导致错误。

我手动删除了整个文件夹并重新部署成功...然后更新了脚本。

【讨论】:

【参考方案10】:

我在开始使用 VWD Express 2012 时遇到了同样的问题(在我使用 Express 2010 之后,它曾经可以正常工作) 转到我的主机控制面板并将 ASP.NET 版本从 2.0-Classic 更改为 4.0 Classic,如图所示。问题消失了。

【讨论】:

【参考方案11】:

这个选项为我解决了这个问题。基本上,它会删除上次部署后留下的所有孤立文件。

【讨论】:

【参考方案12】:

终于,我找到了问题所在。如果您像我一样使用 MVC 框架,请更新您的 MVC 版本。在我的情况下,我将 MVC 4.0.0.0 更改为 4.0.0.1 并将所有项目引用的“本地副本”属性检查为“真”。之后我的问题解决了。请查看所有配置文件中的 MVC 版本(4.0.0.0->4.0.0.1)

并注意 asp 编译器警告消息。

【讨论】:

【参考方案13】:

过去几天我一直在努力解决这个问题。至少在我的情况下,错误消息完全具有误导性,与预编译的网站无关。有很多文章或帖子给出了许多不同的答案,只会增加混乱。我个人认为这个错误主要是由于缺少引用或不正确的版本控制造成的。为了尽快解决问题,您必须排除此问题,或以其他方式修复缺失/错误的参考。

为此,您需要使用名为“Assembly Binding Log Viewer”的工具。该工具会告诉您哪些参考文献缺失或版本错误。如果缺少/不匹配的参考,请继续修复它;否则您需要执行其他魔术技巧,例如检查 App Pool 是否为 32 位或权限。

步骤:

    在您的服务器上创建以下文件夹

    C:\fuslog C:\fuslog\logs

    将程序集绑定日志查看器复制到您的服务器的 C:\fuslog:

    您可以在这样的位置找到该程序

    C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\fuslogvw.exe

    您可能需要查看“Program Files”而不是“Program Files (x86)” 或查看不同版本而不是“v7.0A”

    在服务器上执行 fuslogvw.exe

    点击“设置...”

    确保选中“将失败记录到磁盘”

    勾选启用自定义日志路径并在框中输入以下内容:C:\fuslog\logs

    点击确定

    回收/重置您的应用程序池以强制执行新绑定

    单击刷新。现在你可以在这里看到失败的绑定

    找到确切绑定的更好方法是转到 c:\fuslog\logs\Default。在这里,您可以找到确切的绑定失败。有些是无关紧要的,您需要通过反复试验找到关键的。我的是以下失败:

     System.Web.Mvc, Version=4.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35
    

我通过在我的网站 web.config 中添加以下条目来解决此问题:

<configuration>
    ...
    <runtime>
        ...
        <!-- Added this entry to fix the issue -->
        <dependentAssembly>
            <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="0.0.0.0-4.0.0.1" newVersion="4.0.0.0" />
        </dependentAssembly>
        ...
    </runtime>
    ...
</configuration>

我希望这有助于其他人快速解决问题。

【讨论】:

谢谢哥们。对于这个描述得很好的解决方案,你应该得到我所有的投票。我认为上面所有的答案都应该被你的取代。荣誉。值得一提的是下面的文章。 hanselman.com/blog/… 这是我能够在我们企业项目的众多 dll 中找到丢失的唯一方法,IIS 无法提供任何其他线索。 程序集绑定可以很好地确定哪个程序集失败!启用它的更短方法是在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion 中将 EnableLog 设置为 1。 port135.com/2018/05/17/… 在尝试更新网站数小时后,您的评论拯救了我和我的同事。祝福你和你的。【参考方案14】:

首先检查可用的磁盘空间。当托管 IIS 的硬盘空间不足时,我收到此错误。

【讨论】:

【参考方案15】:

在我的 asp.net mvc razor 视图 (.cshtml) 错误的情况下,/bin 文件夹包含两个用于同一视图的 .compiled 文件。其中一个是旧的,需要删除。

我在控制器视图子文件夹中还有第二个视图,也需要删除。

出现问题的原因是我将视图从控制器视图子文件夹移动到共享文件夹中,但是我的部署过程(Visual Studio 发布)没有从服务器中删除过时的视图和 view.compiled 文件。您可以指示 Visual Studio 始终清理目标文件夹,但这会使部署过程变慢。

【讨论】:

【参考方案16】:

万一更新了再重新编译。再次复制 bin 文件夹中的所有文件以及从其各自文件夹更新的特定文件。

【讨论】:

【参考方案17】:

就我而言,我没有上传常见的 DLL,如 AjaxControlToolkit.dll、Telerik.dll 等。 我上传了整个已发布的文件夹,它为我修复了它。

【讨论】:

【参考方案18】:

在尝试了其他几种解决方案后,我们通过重新启动 AppPool 解决了这个问题。在这种情况下,重新发布不是一种选择。

【讨论】:

【参考方案19】:

这个错误发生在我身上,我解决了。

当您想要发布您的网站时,请检查在 Visual Studio 中使用固定命名和单页程序集

你会看到这个问题会解决的!

【讨论】:

我的问题不是缺少程序集(最可能的原因),所以这位先生用他的回答解决了我的问题。谢谢丹尼! 我遇到了这个问题,我总是使用这个选项进行编译。有什么建议吗? 这是在哪里配置的?【参考方案20】:

当我对现有站点进行一些更改时,我遇到了这个问题。

为了从问题中恢复,我从 bin 文件夹中删除了所有文件并重新部署它们。

问题随即解决。

我希望这可能对某些人有所帮助。

【讨论】:

【参考方案21】:

当我将网站从 2.0 升级到 4.0 时出现此错误。该错误是由站点的root 目录中的文件PrecompiledApp.config 引起的。一旦我删除了那个文件,网站就开始工作了。

【讨论】:

在我的情况下,将 updateable 更改为 true 时错误消失了 我重命名文件,然后恢复原来的名称,工作【参考方案22】:

我知道该错误是在抱怨其他问题,但我保证在我的情况下,问题只是 访问权限不足(网络服务或应用程序池标识或 IUSR)无法使 asp.net 帐户正常工作使用该特定文件。

这是由于在我们的 VPS 环境中部署异常并将 bin 文件与新发布的文件混合在一起。

解决方案

需要将特定文件权限替换为正确的 Bin 文件夹权限,就像 Bin 中其他正常工作的文件(并且不会出现该错误)一样。

【讨论】:

【参考方案23】:

就像上述所有答案的脚注一样,这些答案通过重新发布以替换丢失的程序集解决了这个问题......虽然我以前用相同的解决方案解决了这个问题,但我刚刚遇到了另一个可能发生的原因帮助他人。

运行我的网站的 AppPool 将“启用 32 位应用程序”设置为 false。通过应用程序池的“高级设置”对话框将其更改为 true,我解决了我的问题。

希望能帮助其他一些可怜的傻瓜。

【讨论】:

你是一个很棒的人。这正是我对旧的 .NET v2.0 ASP.NET 站点的问题。【参考方案24】:

在我的情况下,重新部署相同的文件也解决了这个问题。

所以也许在尝试其他任何事情之前先尝试再次部署您的应用程序(bin 文件夹内容应该足够了)

顺便说一句:在我的情况下,当 C 驱动器空间不足时,错误就开始了。

编码愉快! 中科

【讨论】:

【参考方案25】:

它原来是 MSI 中缺少的(非 Web)DLL,我认为它被给出错误的页面使用。我要说的是一个非常具有误导性的错误消息,因为该页面肯定是预编译的,但缺少对该 DLL 的引用。

【讨论】:

以上是关于如何修复 ASP.NET 错误“文件'nnn.aspx'尚未预编译,无法请求。”?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复访问被拒绝路径错误asp.net应用程序访问网络共享

如何修复 CORS 错误:ASP .NET C# 中的 MethodDisallowedByPreflightResponse

如何修复 HTTP 错误 500.22 - 内部服务器错误检测到 ASP.NET 设置不适用于集成托管管道模式

如何在asp.net Web方法中修复“改造和Web服务中的500个内部服务器错误”[关闭]

如何修复不匹配的 Azure 管道 yaml asp.net sdk 版本

奇怪的间歇性 SQL 连接错误,重新启动时修复,3-5 天后恢复 (ASP.NET)