发布ASP.NET网站时出现“Object reference not set to an instance of an object.”错误。

12

我已经对这个错误感到非常厌烦了。我已经在网上搜索了所有可能的建议,并尝试了每一个解决方案,但都没有成功。

  1. 删除app_code、build文件夹,重新添加文件并发布。(没有成功)
  2. 删除临时asp.net文件。(没有成功)

最后我甚至尝试了使用命令行,并获得了以下的堆栈跟踪信息。

error ASPRUNTIME: Object reference not set to an instance of an object.

[NullReferenceException]: Object reference not set to an instance of an object.
   at System.Web.Compilation.BuildManager.CopyPrecompiledFile(VirtualFile vfile,
 String destPhysicalPath)
   at System.Web.Compilation.BuildManager.CopyStaticFilesRecursive(VirtualDirect
ory sourceVdir, String destPhysicalDir, Boolean topLevel)
   at System.Web.Compilation.BuildManager.CopyStaticFilesRecursive(VirtualDirect
ory sourceVdir, String destPhysicalDir, Boolean topLevel)
   at System.Web.Compilation.BuildManager.CopyStaticFilesRecursive(VirtualDirect
ory sourceVdir, String destPhysicalDir, Boolean topLevel)
   at System.Web.Compilation.BuildManager.PrecompileAppInternal(VirtualPath star
tingVirtualDir)
   at System.Web.Compilation.BuildManager.PrecompileApp(VirtualPath startingVirt
ualDir)
   at System.Web.Compilation.BuildManager.PrecompileApp(ClientBuildManagerCallba
ck callback)
   at System.Web.Compilation.BuildManagerHost.PrecompileApp(ClientBuildManagerCa
llback callback)
   at System.Web.Compilation.BuildManagerHost.PrecompileApp(ClientBuildManagerCa
llback callback)
   at System.Web.Compilation.ClientBuildManager.PrecompileApplication(ClientBuil
dManagerCallback callback, Boolean forceCleanBuild)
   at System.Web.Compilation.ClientBuildManager.PrecompileApplication(ClientBuil
dManagerCallback callback)
   at System.Web.Compilation.Precompiler.Main(String[] args)

我使用了以下命令行:

aspnet_compiler.exe -p d:\code\websites\brokerweb -v / d:\code\websites\published -f -c -errorstack -u

你尝试过回滚到源代码控制中最后一个已知的可行版本,并尝试发布吗?我想排除您的代码与Visual Studio发布代码之间可能存在的问题。 - Joel Coehoorn
是的,即使那也不再起作用了。同样的问题。 - Johan
14个回答

9
当我尝试使用MSBUILD编译项目时,出现了这个错误——在Visual Studio内构建很好,在本地浏览器中也能调试。在VS内的发布选项也可行。但是命令行的MSBUILD每次都会导致项目出错。
我通过打开网站的“属性页面”,在“MSBuild选项”标签上取消勾选“允许此预编译站点更新”选项,然后点击“全部保存”来解决这个问题。

1
我花了整整两天的时间来解决这个问题,但最终它像魔法一样奏效了。但我仍然不确定,“允许此预编译站点可更新”为什么会导致这个错误? - Amit
所有其他页面上提出的解决方案都不可靠;这是唯一真正的解决方案。 - Jason P Sallinger

7

我也曾遇到过类似的问题,将解决方案目录树中的压缩标志移除后,编译器又可以正常工作了。


1
如果我可以投票一千次,我会这样做。这是我的原因。 - Alexis
1
你在哪里找到这个选项? - ganjan
1
@ganjan,它在项目/解决方案文件夹的高级属性中。 - Sam

5

通常发生这种情况是因为 bin 目录中的 *.dll.refresh 文件指向的位置不再可用。删除 *.dll.refresh 文件应该可以解决问题。


4

我知道这是一个老帖子,但以防万一有人会发现这很有用:

对我而言,这个问题的原因是 McAfee 防病毒软件

ASPNETCOMPILER(0,0):Error ASPRUNTIME:对象引用未设置为对象的实例


我的 McAfee 在我们公司网络中引起了这个问题。我让我们的 AV 技术员修复了它,然后问题消失了。但他休假后,AV 扫描程序又开始扫描目录了(GPO 更新)。该死。 - Chase Florell

2

我在编译MVC WebApplication视图时遇到了类似的问题。只有在VS或MSBuild内部构建解决方案时才会抛出NullReferenceException异常。从命令行运行aspnet_compiler.exe没有错误。

error ASPRUNTIME: Object reference not set to an instance of an object.

[NullReferenceException]: Object reference not set to an instance of an object.
   at System.Web.Compilation.DiskBuildResultCache.CacheBuildResult(String cacheKey, BuildResult result, Int64 hashCode, DateTime utcStart)
   at System.Web.Compilation.BuildManager.CacheBuildResultInternal(String cacheKey, BuildResult result, Int64 hashCode, DateTime utcStart)
   at System.Web.Compilation.WebDirectoryBatchCompiler.CacheAssemblyResults(AssemblyBuilder assemblyBuilder, CompilerResults results)
   at System.Web.Compilation.WebDirectoryBatchCompiler.CompileAssemblyBuilder(AssemblyBuilder builder)
   at System.Web.Compilation.WebDirectoryBatchCompiler.<CompileNonDependentBuildProviders>b__0(AssemblyBuilder assemblyBuilder)
   at System.Web.Compilation.CompilationUtil.CompileParallel(ICollection assemblyBuilders, Action`1 action)
   at System.Web.Compilation.WebDirectoryBatchCompiler.CompileNonDependentBuildProviders(ICollection buildProviders)
   at System.Web.Compilation.WebDirectoryBatchCompiler.Process()
   at System.Web.Compilation.BuildManager.BatchCompileWebDirectoryInternal(VirtualDirectory vdir, Boolean ignoreErrors)
   at System.Web.Compilation.BuildManager.BatchCompileWebDirectory(VirtualDirectory vdir, VirtualPath virtualDir, Boolean ignoreErrors)
   at System.Web.Compilation.BuildManager.PrecompileWebDirectoriesRecursive(VirtualDirectory vdir, Boolean topLevel)
   at System.Web.Compilation.BuildManager.PrecompileWebDirectoriesRecursive(VirtualDirectory vdir, Boolean topLevel)
   at System.Web.Compilation.BuildManager.PrecompileAppInternal(VirtualPath startingVirtualDir, IEnumerable`1 excludedVirtualPaths)
   at System.Web.Compilation.BuildManager.PrecompileApp(VirtualPath startingVirtualDir, IEnumerable`1 excludedVirtualPaths)
   at System.Web.Compilation.BuildManager.PrecompileApp(ClientBuildManagerCallback callback, IEnumerable`1 excludedVirtualPaths)
   at System.Web.Compilation.BuildManagerHost.PrecompileApp(ClientBuildManagerCallback callback, List`1 excludedVirtualPaths)
   at System.Web.Compilation.BuildManagerHost.PrecompileApp(ClientBuildManagerCallback callback, List`1 excludedVirtualPaths)
   at System.Web.Compilation.ClientBuildManager.PrecompileApplication(ClientBuildManagerCallback callback, Boolean forceCleanBuild)
   at System.Web.Compilation.ClientBuildManager.PrecompileApplication(ClientBuildManagerCallback callback)
   at System.Web.Compilation.Precompiler.Main(String[] args)

在网上寻找答案并使用ProcessMonitor后,我发现当编译器尝试编译ReportService.svc文件时会出现问题。如果删除该文件或更改其扩展名,则一切都能正常编译。 非常奇怪的解决方法修复了编译svc文件的问题。几天前,我在这个项目上启用了ntfs压缩来节省空间。而这就是问题所在。当从网站文件夹中移除ntfs压缩属性时,NullReferenceException问题被解决了。

1
我遇到了类似的问题。应用程序可以在IDE中构建和运行,但无法发布;在“将dll合并为单个程序集”的阶段崩溃。经过研究aspnet_merge.exe,我发现通过在发布选项中取消“发出调试信息”复选框来解决了该问题。这可能不是解决问题的“干净”方法,但是它是一个解决方法。希望这能帮到你。 Andrew

1
我最近遇到了这个错误。正如@samiz上面提到的,首先,您需要删除所有*.dll.refresh。然后构建和发布您的网站。然而,有时候,就像我的情况一样,当您删除*.dll.refresh,然后发布您的网站时,错误仍然会出现。我进行了很多测试,但没有任何改变。
我还创建了一个新文件夹,并复制了我网站所需的所有*.dll文件。接下来,删除Bin文件夹中的所有*.dll文件,然后逐个添加它们。
最后,我重新启动了我的电脑,然后尝试发布我的网站。信不信由你,它运行良好,没有出现错误。

1
从网站的Bin文件夹中删除所有*.compiled文件对我有用。 :)
这些文件是安全的,可以删除,并在预编译期间创建。有关更多信息,请查看MSDN链接

1

在Visual Studio 2017中,这里提供的解决方案都没有起作用。我通过以下步骤解决了问题:

  1. 如果正在运行,请退出Visual Studio
  2. 从开始菜单打开Visual Studio Installer
  3. 已安装选项卡下,会显示计算机上的Visual Studio版本
  4. 单击更多选项并选择修复
  5. 修复操作完成后,在Visual Studio中重新启动项目
  6. 现在,当你单击发布时,应该不会再出现此错误

0

再次声明,这是一篇旧文章,但我有以下发现:

将VS2012 asp.net web forms应用程序升级到VS2013

尝试发布 - 得到与OP相同的错误。

当我最终弄清楚问题所在时,问题是由于一件事情引起的:

当我查看web.config中的成员资格提供程序时,一个项目缺少connectionStringName属性:

坏的:

<membership defaultProvider="SomeMembershipProvider">
  <providers>
    <clear />
    <add name="SomeMembershipProvider" type="System.Web.Security.SqlMembershipProvider" passwordFormat="Encrypted" applicationName="SomeAppName"  />
    <add connectionStringName="SomeConnectionString" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="true" applicationName="/SomeAppName" requiresUniqueEmail="false" blaw blaw blaw />
  </providers>
</membership>

好的:

<membership defaultProvider="SomeMembershipProvider">
  <providers>
    <clear />
    <add name="SomeMembershipProvider" connectionStringName="PerhapsSomeOtherConnectionString" type="System.Web.Security.SqlMembershipProvider" passwordFormat="Encrypted" applicationName="SomeAppName"  />
    <add connectionStringName="SomeConnectionString" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="true" applicationName="/SomeAppName" requiresUniqueEmail="false" blaw blaw blaw />
  </providers>
</membership>

我不确定为什么其中一个connectionStringName属性被剥离了,甚至不确定它是否曾经存在过,但你可以通过这个设置来开启或关闭此错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接