OwinStartup未触发

402

我曾经完美地运行OwinStartup配置代码,但现在它不起作用了。不幸的是,我不确定我做了什么导致它停止工作,并且很难找出问题所在。

为了确保我掌握了基础知识,我仔细检查确保我有

[assembly:OwinStartup(typeof(WebApplication.Startup))] 

属性正确分配并确保我没有设置owin:AutomaticAppStartup为false的appSetting,所以我设置了一个为true以确保安全,因为之前没有任何内容。

<add key="owin:AutomaticAppStartup" value="true" />

我还尝试着特别调用了appSetting:

<add key="owin:appStartup" value="WebApplication.Startup" />
在它停止工作之前,我将Microsoft.Owin.Security NuGet包升级到2.0.2,所以我尝试将它们恢复到2.0.1(那真是一场痛苦),但没有改变任何东西。 我在项目中安装了WebActivator,并使用它来引导其他东西,但我已经在一个新的WebApplication模板上测试过它,它在那里工作,所以我不认为它是罪魁祸首。
我还尝试删除我的Startup类并使用Visual Studio添加一个新的类,使用OWIN Startup Class类型进行添加,但也没有调用它。接下来,我尝试添加第二个Startup类,因为我知道如果定义了多个OwinStartup属性,它会引发异常,但它那里没有引发任何异常。
不确定还有什么别的方法可尝试。有什么想法吗?
更新
事实证明,当我使用Resharper删除未使用的引用时,它删除了对Microsoft.Owin.Host.SystemWeb的引用。

58
你的应用程序中是否安装了Microsoft.Owin.Host.Systemweb包?请确保这个dll也在bin文件夹中。 - Praburaj
1
就是这样了。非常感谢。我想发生的事情是我曾经使用Resharper删除了未使用的引用,它认为那个引用不需要。如果您想将此作为答案,请告诉我,我一定会标记它为解决方案。感谢您的帮助。 - Jeff Treuting
2
Jeff,ReSharper已删除对Microsoft.Owin.Host.Systemweb的“未使用”引用 - 你是在说“using”语句吗?在哪个文件中,Startup.cs? - vkelman
我说的是项目本身内部的实际引用。因此,DLL基本上已从项目中删除,我不得不将其重新添加。展开项目中的“引用”文件夹,查看是否列出了Microsoft.Owin.Host.SystemWeb。 - Jeff Treuting
4
我曾经遇到和你完全一样的问题,resharper删除了对Microsoft.Owin.Host.SystemWeb的引用。我通过在Visual Studio中打开包管理器控制台窗口并运行以下命令来解决它:PM> Update-Package -reinstall Microsoft.Owin.Host.SystemWeb - Joseph King
1
作为对@JoeKing上面评论的更新。PM控制台无法更新,显示“未找到”。我不得不进行重新安装。PM> Install-Package Microsoft.Owin.Host.SystemWeb - Morvael
22个回答

867

请确保在项目中安装了Microsoft.Owin.Host.SystemWeb包。这个包用于在IIS托管的应用程序中进行启动检测。如果需要更多信息,可以参考这篇文章


4
假设我们有调用位置(PreApplicationStartMethod),在不需要直接引用Microsoft.Owin的情况下,如何在使用/封装OWIN的库中以编程方式启动OWIN启动检测?我们如何特别引发Katana调用“Startup.Configuration(IAppBuilder)”? - Jason Kleban
7
尝试从头开始创建一个应用程序,而不使用MVC模板。这让人绝望了2个小时。 - mkvlrn
2
就在我大声喊着resharper是最大的生产力杀手时,我遇到了这个问题,一周都不知道为什么web api停止工作了。又一个证明resharper正在破坏我的生产力。 - Ivan G.
6
要求在编译期间实际上并未使用的库是Microsoft的糟糕设计!Resharper正在尽力,但对于这样糟糕的决策无能为力。 - ps_ttf
29
太神奇了。每次我添加OWIN启动文件时都会遇到这个问题。而且每次我都忘记原因,最后看到了这个答案。 - Tobias
显示剩余2条评论

85

如果您从较旧的MVC版本升级,请确保您没有

  <add key="owin:AutomaticAppStartup" value="false" />

在您的 web.config 中,将其更改为true。这将禁止调用启动逻辑。

  <add key="owin:AutomaticAppStartup" value="true" />

我知道你已经提到了这一点,但有时像我这样的人不会仔细阅读整个问题,而是直接跳转到答案...

在某个阶段 - 当我升级到MVC 5时,这个被添加了进来,直到今天我才发现它。


在一个旧的mvc项目中实现Owin启动类时遇到了同样的问题。改变值就解决了! - Darxtar

55

讨论中提到的原问题有另一种解决方案 - Owin "未触发"。在我的情况下,我花了几个小时认为它没有触发是由于无法在其中设置断点。

调试Visual Studio中的OWIN启动时

  • IIS Express - 运行 "F5" 将在OWIN启动代码上断点

  • IIS - 运行 "F5" 不会 在OWIN(和global.asax)代码加载之前断点。 如果您附加到W3P.exe,则可以跟踪其中的步骤。


2
你是对的!这只是在本地IIS下运行时,Visual Studio 2013调试器不会停在Startup类内部的断点上。很奇怪。 - vkelman
4
你能详细说明一下“attach to W3P.exe”是什么意思吗?我在使用IIS时遇到了断点无法被触发的问题,但在使用IISExpress时可以被触发。我已经停止了应用程序,附加到了w3wp.exe,然后浏览本地主机,但是断点依然没有被触发。我有什么遗漏的步骤吗? - Sean
我无法附加到正在运行的应用程序实例,尽管我相信以前能够这样做。我尝试在浏览器中打开应用程序,然后在VS2013中使用“调试->附加到进程”,然后重新加载浏览器中的页面。VS没有停止。我知道OWIN启动正在执行:我为调试目的添加了一些日志记录。就像回到了中间调试打印的黑暗时代。 - vkelman
3
一位同事向我展示了在IIS中,如果您双击默认应用程序池并将托管管道模式更改为经典模式,则调试器将在启动时中断。我在那之后运行了应用程序,但出现了一个错误,说应用程序必须在集成模式下运行,因此我不得不将其改回来,但至少能够看到它是在那里中断的。 - Matt Bodily
另一个选项是重新启动IIS。要在命令行上重新启动IIS,请打开终端并键入:iisreset - gschuster
显示剩余2条评论

27
如果您在Startup类中调试代码时遇到问题,我也曾经遇到过这个问题-或者我认为是这样。 代码正在触发,但我认为它发生在调试器附加之前,因此您无法设置断点并查看发生了什么。
您可以通过在Startup类的Configuration方法中抛出异常来证明这一点。

这正是正在发生的事情。是否有解决方案可以在调试器附加后启动Startup类? - Tom Schreck
请问如何在配置方法中抛出异常? - Karthikeyan
1
在Startup.cs中添加了以下代码以证明它已被执行:System.IO.File.WriteAllText(@"c:\temp\startup.txt", "Started"); - RaoulRubin
1
@Karthikeyan - 在 ConifureAuth(app); 行之后或之前(无所谓)添加以下代码行 - throw new Exception("Hello"); - Francis Rodgers
将第一行改为 System.Threading.Sleep(10_000),以便在继续之前等待足够长的时间以便调试器可以附加(根据需要进行调整)。 - James Gray
您可以在任何中间件中进行调试,只需添加 System.Diagnostics.Debugger.Launch(); - Eric Herlitz

23

调试提示

如果调试不起作用,请尝试使用IIS Express或尝试以下方法来调试本地IIS:

使用本地IIS

出于某种原因,此方法可以启用调试:

  1. 请求一个网页
  2. 连接到w3wp.exe进程
  3. 触摸web.config文件
  4. 请求一个网页

额外提示

也许这样做会清除缓存:

  1. 在web.config中添加optimizeCompilations属性,将其值设置为false

    <compilation debug="true" ... optimizeCompilations="false">

  2. 运行站点

  3. 撤消对web.config的更改

3
修改设置中的 optimizeCompilations="false" 对我有效。 - barsh
你拯救了我的一天!optimizeCompilations="false" 对我有用。 - Vostrugin
优化编译过程,让我的一天得救了。谢谢 :) - Bogdan Stojanovic
#5-7挽救了我的职业生涯 - Alex
5-7拯救了我的职业生涯 - undefined

15

我有类似的问题,清除临时的ASP.NET文件解决了它。希望这能帮助到其他人。


4
只供参考,这里有另一个回答,提供了更多关于这些文件存储在哪里的细节:https://dev59.com/22Qo5IYBdhLWcg3wVuGP - Sam Storie
1
我正在运行IIS EXPRESS和Windows 8:在这里删除:C:\Users\Your User Name\AppData\Local\Temp\Temporary ASP.NET Files\vs - Wolf
谢谢,我注意到这个答案,因为在这之前我遇到了一个错误,关于某个东西锁定了临时ASP.NET文件夹中的文件。 - Elger Mensonides
我曾经为此苦苦挣扎了整整一天,最终这个方法奏效了。在清空“Temporary ASP.NET Files”文件夹内容和调用Owin启动后,问题得以解决。 - Harsh Baid

12

我也遇到了同样的问题。Microsoft.Owin.Host.SystemWeb包已安装,但在安装过程中,由于某种原因,NuGet无法将dll添加为引用。确保您的项目具有该引用。如果没有,请尝试重新安装:

update-package Microsoft.Owin.Host.SystemWeb -reinstall

在重新安装时,我遇到了以下类似错误,但不知何故它起作用了:

系统调用失败。(来自 HRESULT: 0x80010100 (RPC_E_SYS_CALL_FAILED) 的异常)


我已经为此奋斗了一段时间,这是解决我的问题的方法。我在packages.config中有nuget引用,但我的csproj没有引用。 - Zackary Geers
1
在我的情况下,我根本没有安装这个包。运行install-package Microsoft.Owin.Host.SystemWeb解决了我的问题。感谢提示。 - J. Horn

5

当我将Owin添加到现有的Web项目中时,遇到了同样的问题。最终我发现问题是由于web.config文件中以下内容导致的。

<assemblies>
  <remove assembly="*" />
  <add assembly="System.Web.Mvc" />
  <add assembly="System.Web.WebPages" />

   ...

</assemblies>

问题在于remove assembly="*"这一行。当我删除此行时,Owin启动代码运行了。我最终将其更改为以下内容,并且它完美地工作了。

<assemblies>
  <remove assembly="*" />
  <add assembly="Microsoft.Owin.Host.SystemWeb" />
  <add assembly="System.Web.Mvc" />
  <add assembly="System.Web.WebPages" />
  <add assembly="System.Web.Helpers" />
...
</assemblies>

3
我曾参与一个Sitecore项目,发现在我的web.config文件中没有<remove assembly=*"/>标签。但是添加<add assembly="Microsoft.Owin.Host.SystemWeb" />解决了我的问题。 - burki
感谢@burki的评论,因为你的评论,我强迫自己尝试了这个解决方案,它对我们也起作用了!自从VS更新到15.9.9以后,Owin启动类就没有触发。 - David
非常感谢!这解决了我的问题,我不得不添加以下内容:<assemblies>         <remove assembly="*" />         <add assembly="myapplication" />         <add assembly="Microsoft.Owin.Host.SystemWeb" />         <add assembly="Microsoft.Owin.Security" />         <add assembly="System.Web.Mvc" />         <add assembly="System.Web.WebPages" />         <add assembly="System.Web.Helpers" />       </assemblies> - trykyn

4
在我的情况下,Microsoft.Owin.Host.SystemWeb包已经存在于项目中。但是web.config文件中缺少下面两个标签。
<add key="owin:AutomaticAppStartup" value="true" />
<add key="owin:appStartup" value="namespace.className.methodName" />

添加它们后,它可以平稳地运行。


3

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