今天在学习MVC模式时碰到了一个问题,在网上搜索后没有解决,最后才发现是一个很白痴的问题……
不过倒是借机学会了很多新的东西……
所以在此给与后来人一个指示。
如果想直接看最后的解决办法,可以直接翻到最后。
以下为个人查询原因的经历,记录一下供自己以后回顾。
——————————————————————————————————————
首先我们来看报错:
“/”应用程序中的服务器错误。
未能加载文件或程序集“System.Diagnostics.DiagnosticSource, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)
说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.IO.FileLoadException: 未能加载文件或程序集“System.Diagnostics.DiagnosticSource, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)
源错误:
执行当前 Web 请求期间生成了未经处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。
程序集加载跟踪: 下列信息有助于确定程序集“System.Diagnostics.DiagnosticSource, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51”未能加载的原因。
=== 预绑定状态信息 ===
日志: DisplayName = System.Diagnostics.DiagnosticSource, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
(Fully-specified)
日志: Appbase = file:///D:/#测试/MVC/MVC/
日志: 初始 PrivatePath = D:\#测试\MVC\MVC\bin
调用程序集: Microsoft.AspNet.TelemetryCorrelation, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35。
===
日志: 此绑定从 default 加载上下文开始。
日志: 未找到应用程序配置文件。
日志: 使用主机配置文件: C:\Users\tr27\Documents\IISExpress\config\aspnet.config
日志: 使用 C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config 的计算机配置文件。
日志: 策略后引用: System.Diagnostics.DiagnosticSource, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
日志: 尝试下载新的 URL file:///C:/Users/tr27/AppData/Local/Temp/Temporary ASP.NET Files/vs/26b9e87d/284b9cf9/System.Diagnostics.DiagnosticSource.DLL。
日志: 尝试下载新的 URL file:///C:/Users/tr27/AppData/Local/Temp/Temporary ASP.NET Files/vs/26b9e87d/284b9cf9/System.Diagnostics.DiagnosticSource/System.Diagnostics.DiagnosticSource.DLL。
日志: 尝试下载新的 URL file:///D:/#测试/MVC/MVC/bin/System.Diagnostics.DiagnosticSource.DLL。
警告: 比较程序集名称时发生不匹配: 修订号
错误: 未能完成程序集的安装(hr = 0x80131040)。探测终止。
堆栈跟踪:
[FileLoadException: 未能加载文件或程序集“System.Diagnostics.DiagnosticSource, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)]
Microsoft.AspNet.TelemetryCorrelation.TelemetryCorrelationHttpModule.Application_BeginRequest(Object sender, EventArgs e) +0
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +200
System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step) +132
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +73
看到这个错误,最吸引我们注目的内容肯定是
未能加载文件或程序集“System.Diagnostics.DiagnosticSource, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)
根据以往对“未能加载文件或程序集”的错误处理,我们会下意识的认为,是DLL文件的引用错误问题。
于是我们会自然而然的开始检查这三个地址:
日志: 尝试下载新的 URL file:///C:/Users/tr27/AppData/Local/Temp/Temporary ASP.NET Files/vs/26b9e87d/284b9cf9/System.Diagnostics.DiagnosticSource.DLL。
日志: 尝试下载新的 URL file:///C:/Users/tr27/AppData/Local/Temp/Temporary ASP.NET Files/vs/26b9e87d/284b9cf9/System.Diagnostics.DiagnosticSource/System.Diagnostics.DiagnosticSource.DLL。
日志: 尝试下载新的 URL file:///D:/#测试/MVC/MVC/bin/System.Diagnostics.DiagnosticSource.DLL。
如果我们去找了,我们会惊讶的发现,这三个地址里都有“System.Diagnostics.DiagnosticSource”这个DLL文件啊??
这是怎么回事?
如果你像我一样,也许此时就会开始猜测文件的版本问题。
于是开始搜索“System.Diagnostics.DiagnosticSource”这个DLL文件的版本问题。
如果你搜索到这个页面
那么,恭喜你,你接触到了NuGet包的使用方法。
如何把这个包引入到自己的工程里呢?
重新打开VS,搜索之后,工具》NuGet包管理器》程序包管理控制台,打开之后,在控制台输入命令……咦,为什么不能成功的下载?
然后经过搜索后,你发现:
原来,NuGet它是用来添加引用的!只能在项目中添加!它不会影响你没有添加过这些包的其他项目!
明白了这些的你打开项目,继续打开NuGet程序包管理控制台,继续在控制台输入命令:
PM>Install-Package System.Diagnostics.DiagnosticSource -Version 4.5.1
大概两三秒,添加完成,你信心满满的运行程序……
未能加载文件或程序集……
咳咳,忘记了具体是什么错误……
之后,根据百度到的各种信息,我们有了以下的收获。
————————————————————————————————————————————
就在我找了很多方案,按着上述行为不断重试并不断出现新的错误的时候,我没有发现一个很关键的信息。
“/”应用程序中的服务器错误。
以及
D:/#测试/MVC
这个路径。
也就是说,IIS也很明显的给出了错误原因(“/”应用程序中的服务器错误)。
我喜欢在项目路径中放一个以“#”开头的文件夹,以保证起其的置顶效果。
如果看到这里的您也出现了这个搜便全网页找不到的错误的话,多半和我一样也是这个原因了。
如果想要保持置顶效果,将“#test”改成“01test”也有同样的效果~~~~
如果觉得对您有帮助,请右上角点个赞并评论一句吧~~~~~~
附注:
值得一提的是,在我另外一台电脑上我同样将项目安放在了带有“#”命名的文件目录下,此时通过浏览器加载IIS后,并没有出现问题。
不知道是因为之前已经运行过(在没有带“#”的另一个文件夹中)的原因,还是“.NET Framework”版本的问题,还是其他组件的影响(有怀疑是IIS部署器的版本问题)。
另外浏览器也有关系,chorem和IE的表现显著比edge要好。