【发布时间】:2017-07-26 19:14:42
【问题描述】:
我有一个与this one 非常非常相似的问题。
嗨。
我有一个针对 .NET 4.61 的应用程序(服务)并尝试使用 WebListener 移动到 AspNetCore 自托管。
我正在尝试通过在控制台应用程序中对其进行测试来调查需求。
我创建的项目是一个普通的 Windows 控制台应用程序,我使用 nuget 引用了所有必需的包并创建了所需的启动类,并使用 WebHostBuilder 创建和启动主机。
(我没有普通的 Windows 控制台应用程序,但我的 ubuntu 笔记本电脑上有一个 dotnet 控制台应用程序)
我们之前尝试和测试过的内容略有不同。
到目前为止,我只创建了一个 HomeController 并让 Index 返回一个 string 和 "Hello world"。运行应用程序,访问 localhost 并获得响应。完美。
现在我添加的只是 Index 通过返回 View() 返回一个 IActionResult。然后我在/Views/Home/ 中创建了一个Index.cshtml 文件,现在我得到了这个:
堆栈跟踪:
失败:Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[0] 发生了未处理的异常:发生了一次或多次编译失败:
后跟这样的 150 行:
gee1fd0w.wuj(4,11):错误 CS0246:找不到类型或命名空间名称“System”(您是否缺少 using 指令或程序集引用?)
gee1fd0w.wuj(5,11):错误 CS0246:找不到类型或命名空间名称“System”(您是否缺少 using 指令或程序集引用?)
gee1fd0w.wuj(6,11):错误 CS0246:找不到类型或命名空间名称“System”(您是否缺少 using 指令或程序集引用?)
...
gee1fd0w.wuj(37,13):错误 CS0518:未定义或导入预定义类型“System.Object”
gee1fd0w.wuj(37,13):错误 CS0518:未定义或导入预定义类型“System.Void”
结尾:
gee1fd0w.wuj(33,36):错误 CS0161:'_Views_Home_Index_cshtml.ExecuteAsync()':并非所有代码路径都返回值
在 Microsoft.AspNetCore.Mvc.Razor.Compilation.CompilationResult.EnsureSuccessful()
在 Microsoft.AspNetCore.Mvc.Razor.Internal.CompilerCache.CreateCacheEntry(String relativePath, String normalizedPath, Func'2 编译)
--- 从之前抛出异常的位置结束堆栈跟踪 ---
接下来是:
在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)
在 Microsoft.AspNetCore.Mvc.Razor.Internal.CompilerCache.GetOrAdd(String relativePath, Func'2 编译)
在 Microsoft.AspNetCore.Mvc.Razor.Internal.DefaultRazorPageFactoryProvider.CreateFactory(String relativePath)
在 Microsoft.AspNetCore.Mvc.Razor.RazorViewEngine.CreateCacheResult(HashSet`1 expirationTokens, String relativePath, Boolean isMainPage)
在 Microsoft.AspNetCore.Mvc.Razor.RazorViewEngine.OnCacheMiss(ViewLocationExpanderContext expanderContext, ViewLocationCacheKey cacheKey)
在 Microsoft.AspNetCore.Mvc.Razor.RazorViewEngine.LocatePageFromViewLocations(ActionContext actionContext, String pageName, Boolean isMainPage)
在 Microsoft.AspNetCore.Mvc.Razor.RazorViewEngine.FindView(ActionContext 上下文,字符串 viewName,布尔 isMainPage)
在 Microsoft.AspNetCore.Mvc.ViewEngines.CompositeViewEngine.FindView(ActionContext 上下文,字符串 viewName,布尔 isMainPage)
在 Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.ViewResultExecutor.FindView(ActionContext actionContext, ViewResult viewResult)
在 Microsoft.AspNetCore.Mvc.ViewResult.d__26.MoveNext()
--- 从之前抛出异常的位置结束堆栈跟踪 ---
随后是一系列较短的堆栈跟踪:
在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)
在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__30.MoveNext()
--- 从先前抛出异常的位置结束堆栈跟踪 ---
在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)
在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__28.MoveNext()
--- 从先前抛出异常的位置结束堆栈跟踪 ---
在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ResultExecutedContext 上下文)
在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(状态和下一个,范围和范围,对象和状态,布尔值和已完成)
在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__22.MoveNext()
--- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ResourceExecutedContext 上下文)
在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(状态和下一个,范围和范围,对象和状态,布尔值和已完成)
在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__20.MoveNext()
--- 从先前抛出异常的位置结束堆栈跟踪 ---
在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)
在 Microsoft.AspNetCore.Builder.RouterMiddleware.d__4.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 ---
在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)
在 Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.d__6.MoveNext()
堆栈跟踪结束
现在我不确定我是否完全理解上一张海报得到的答案:
Mvc 的运行时编译依赖于 DependencyContext(deps 文件)来查找仅在使用 dotnet CLI 编译时生成的编译引用。您必须在应用程序启动过程中添加编译引用才能使视图编译正常工作。
我确实通过 dotnet cli 进行了编译,但这里还有什么我遗漏的吗?当我尝试通过运行dotnet new mvc 并删除除控制台项目中的内容之外的所有内容来复制我的项目时。它像雨一样运行,我从我的 Index.cshtml 中得到了 hello world。
Instinct 告诉我问题出在一些文件差异上,但我已经对所有文件进行了差异化,除了 app-name 之外我找不到任何差异。我可能错过了一些东西,但我想知道它是否可能是我不知道的自动魔法?
编辑:
已找到问题,看起来这是他们生成的bin/debug/netcoreapp1.1/<appname>.deps.json 的不同之处。有很多不同之处,现在去研究一下。但是,如果我将该文件从 mvc-project 复制粘贴到控制台应用程序,一切运行正常。
不幸的是,控制台应用程序deps.json-file 有 1300 多行,而 mvc 应用程序版本有 4300 多行,所以我不完全确定通过它并确定为什么一个工作和另一个工作是否可行不要。
编辑:
这似乎是一大堆不同的依赖范围,一大堆 mvc 包含对 "NETStandard.Library": "1.6.1" 的依赖,但还有许多其他的。还有一堆控制台应用程序没有的编译范围。
事实上,这似乎是唯一的区别。 mvc-application 的 deps.json-file 似乎有大约 3000 多行依赖项和编译范围。所以我想我会放弃找出导致问题的原因的想法,并计划学习如何“将控制台应用程序构建到 mvc-app 中”:)
我将把问题留在这里,以防有人发现自己处于类似情况。
【问题讨论】:
-
尝试使用
dotnet restore并删除您的obj和bin目录。 -
这确实有效!这比从另一个项目复制要顺畅得多。谢谢!
-
太棒了。我已经添加了一个答案,因此偶然发现此问题的每个人都可以轻松找到解决方案。我几乎可以肯定这里的关键是删除
obj和bin目录。
标签: razor asp.net-core asp.net-core-mvc