OwinStartup不触发


350

我的OwinStartup配置代码可以正常运行,然后停止工作。不幸的是,我不确定到底要怎么做才能使其停止工作,并且很难解决。

为了确保基本知识,我仔细检查了一下以确保

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

属性分配正确,并确保我没有将owin:AutomaticAppStartup的appSetting设置为false,所以我将其中之一设置为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类类型添加了一个新类,但没有一个被调用。接下来,我尝试添加第二个Startup类,因为我知道如果定义了多个OwinStartup属性,它将引发一个异常,但是在那里不会引发任何异常。

不知道还有什么尝试。有什么想法吗?

更新资料

事实证明,当我使用Resharper删除未使用的引用时,它删除了对Microsoft.Owin.Host.SystemWeb的引用。


37
您是否在此应用程序中安装了Microsoft.Owin.Host.Systemweb软件包。确保此dll也是bin文件夹的一部分?
Praburaj 2013年

1
就是这样 非常感谢。我认为发生的事情是我在某个时候使用Resharper删除了未使用的引用,并且认为不需要该引用。如果您想将此作为答案,我一定会将其标记为解决方案。谢谢您的帮助。
Jeff Treuting

2
Jeff,ReSharper删除了对Microsoft.Owin.Host.Systemweb的“未使用”引用-您是否在谈论“使用”语句?在哪个文件中,Startup.cs?
vkelman 2014年

4
我遇到了完全相同的问题,resharper删除了对Microsoft.Owin.Host.SystemWeb的引用。我在Visual Studio中打开包管理器控制台窗口,运行以下命令PM固定它>更新-包装-reinstall Microsoft.Owin.Host.SystemWeb
乔金

1
作为上述@JoeKing的评论的更新。PM Console不会更新为“未找到”。我必须去重新安装。PM>安装软件包Microsoft.Owin.Host.SystemWeb
Morvael

Answers:


768

确保已Microsoft.Owin.Host.SystemWeb在项目中安装了软件包。在IIS托管的应用程序中启动检测需要此软件包。有关更多信息,请参考本文


4
假设我们有一个调用它的地方(PreApplicationStartMethod),而又不需要这些Microsoft.Owin东西的直接引用,那么有人会如何在已使用/ OWIN封装的库中以编程方式启动Owin启动检测?我们如何专门招来片假名打电话Startup.Configuration(IAppBuilder)
杰森·克莱班

7
尝试从头开始创建应用程序,而不使用MVC模板。这结束了两个小时的绝望。
mkvlrn 2015年

1
就在我大声喊叫者是最大的生产力杀手时,我遇到了这个问题,一个星期都无法弄清为什么Web api停止工作。磨刀石的另一个证明是杀死我的生产力。
伊万·

5
要求引用在编译过程中未真正使用的库是Microsoft的错误设计!Resharper尽力而为,但没有武器可以对付如此糟糕的决定。
ps_ttf

22
惊人。每次添加OWIN启动文件时,我都会遇到此问题。每次我忘记原因,并最终得到这个答案。
Tobias

70

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

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

在你的web.config。它将禁止调用启动逻辑。

改为将其更改为 true

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

我意识到您已经提到了这个问题,但是有时候(像我这样的人)没有读完整的问题,而只是跳到答案...

沿线的某个地方-当我升级到MVC 5时,添加了它,直到今天我才看到它。


在旧的mvc项目中实现Owin启动类时遇到了相同的问题。切换值就成功了!
Darxtar '16

这对我
有用。

51

讨论的原始问题的替代答案-奥文“不开枪”。以我为例,我花了数小时以为它无法触发,因为无法在其中设置断点。

在Visual Studio中调试OWIN启动时

  • IIS Express-运行“ F5”将在OWIN启动代码上中断

  • IIS- 在加载OWIN(和global.asax)代码之后,运行“ F5” 不会中断。如果您附加到W3P.exe,则可以进入它。


2
你是对的!只是Visual Studio 2013调试器不会在Startup类内部的断点处停止-在本地IIS下运行时。奇怪的。
vkelman 2014年

4
您能否详细介绍“附加到W3P.exe”?我有一个断点没有被IIS击中但被IISExpress击中的问题。我已经停止了该应用程序,将其附加到w3wp.exe,然后浏览到我的本地主机,但仍然没有被点击。我错过了什么吗?
肖恩

我也不能附加到正在运行的应用程序实例,尽管我相信我以前可以这样做。我试图在浏览器中打开一个应用程序,然后在VS2013中使用“调试->附加到进程”,然后在浏览器中重新加载页面。VS没有停止。我知道OWIN启动正在执行:我在调试中放入了一些日志。就像回到了中间调试打印的黑暗时代。
vkelman 2014年

2
一位同事刚刚告诉我,如果您在iis中双击默认应用程序池并将托管管道模式更改为经典,则调试器将在启动时中断。之后,我跑了一个错误,说该应用程序必须在Integrated中运行,所以我不得不将其改回,但至少能够看到它在那儿中断了。
马特·博迪利

这里有几件事。“ w3wp.exe”基于应用程序池。如果您的应用程序不是您要求启动该过程的第一个应用程序,则应该能够调试global.asax和owin。即在应用程序池中请求另一个应用程序“附加到w3wp.exe”,然后请求您尝试调试的应用程序。
布雷特·卡斯威尔

26

如果您在调试Startup类中的代码时遇到问题,那么我也遇到了这个问题-或者我以为自己做到了。代码正在触发,但是我相信它是在调试器附加之前发生的,因此您无法在代码上设置断点并查看正在发生的情况。

您可以通过ConfigurationStartup类的方法中抛出异常来证明这一点。


这正是正在发生的事情。有没有解决方案可以在调试器附加后启动Startup类?
汤姆·史瑞克'02

我可以知道如何在Configuration方法中引发异常吗?
Karthikeyan

1
在Startup.cs中添加以下行以证明它已执行:System.IO.File.WriteAllText(@“ c:\ temp \ startup.txt”,“ Started”);
RaoulRubin '16

1
@Karthikeyan-在ConifureAuth(app)之前(无关紧要)添加此行;行-抛出新的Exception(“ H​​ello”);
弗朗西斯·罗杰斯

制作第一行System.Threading.Sleep(10_000),以便它将等待足够长的时间让调试器附加,然后继续(根据需要进行调整)
James Gray

16

调试提示

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

使用本地IIS

由于某种原因,此方法可以调试此方法:

  1. 申请网页
  2. 附加到w3wp.exe进程
  3. 触摸web.config文件
  4. 申请网页

额外提示

也许这样做会刷新缓存:

  1. 在web.config中,添加带有错误值的optimizeCompilations属性

    <compilation debug =“ true” ... optimizeCompilations =“ false”>

  2. 运行网站

  3. 撤消web.config中的更改

2
切换设置optimizeCompilations="false"对我
有用

你救了我的一天!OptimizCompilations =“ false”对我有用。
Vostrugin

optimizeCompilations节省了我的时间。谢谢:)
Bogdan Stojanovic

13

我对此有类似的问题,并且清除了“临时ASP.NET文件”后将其修复。希望这对某人有帮助。


4
仅供参考,这里提供了有关这些文件存储更详细一点另一个答案:stackoverflow.com/questions/16137457/...
山姆Storie

1
我运行IIS EXPRESS和窗口8:在此处删除:C:\ Users \您的用户名\ AppData \ Local \ Temp \ Temporary ASP.NET Files \ vs
Gray Wolf 2016年

谢谢,我注意到了这个答案,因为在此之前我遇到了一个错误,该错误与锁定ASP.NET临时文件文件夹中的文件有关
Elger Mensonides

我整整整整花了整整1天的时间,终于为我工作了。清除Temporary ASP.NET Files文件夹内容后,Owin启动程序被调用。
严厉的拜德

11

我有同样的问题。已安装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
就我而言,我根本没有安装该软件包。运行安装包Microsoft.Owin.Host.SystemWeb解决了我的问题。感谢您的提示。
J. Horn

2

就我而言,IIS应用程序池未设置为v4。是v2。

将AppPool更改为v4,一切正常。


2

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

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

   ...

</assemblies>

删除程序集=“ *”导致了该问题。当我删除此行时,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>

1
我有一个Sitecore的项目,并在我的web.config文件中,没有<删除组件= *“/>标签,但添加<添加组件=” Microsoft.Owin.Host.SystemWeb” />固定我的问题。
burki

感谢@burki,由于您的评论,我强迫自己尝试此解决方案,它也确实对我们有用!自从VS更新到15.9.9之后,Owin启动类就没有触发过。
大卫,

非常感谢!为此,我不得不添加以下内容:<程序集> <删除程序集=“ *” /> <添加程序集=“ myapplication” /> <添加程序集=“ Microsoft.Owin.Host.SystemWeb” /> <添加程序集=“ Microsoft.Owin.Security” /> <添加程序=“ System.Web.Mvc” /> <添加程序=“ System.Web.WebPages” /> <添加程序=“ System.Web.Helpers” /> < /大会>
trykyn19年

1

就我而言,我的网站的输出路径已被某人更改,IIS Express甚至没有加载OWIN,当然也不会点击安装类。将输出路径设置为“ bin \”后,它运行良好。


1

以我为例,该Microsoft.Owin.Host.SystemWeb程序包存在于项目中。

但是下面两个标签在web.config中不存在。

<add key="owin:AutomaticAppStartup" value="true" />
<add key="owin:appStartup" value="namespace.className.methodName" />

添加它们后,它可以正常工作。


1

就我而言,我的web.config

<authorization>
  <allow users="?" />
</authorization>

为了迫使它退回给Owin,我需要它成为

<authorization>
  <deny users="*" />
</authorization>

0

我在这篇文章上弄了很多建议。

我有以下内容,但仍无法到达断点。引发异常证明正在输入代码。

<appSettings>
...
  <add key="owin:AutomaticAppStartup" value="true" />
  <add key="owin:appStartup" value="SSOResource.Startup, SSOResource" />
...
</appSettings>

最终,我无奈地查看了project-> properties,然后在WEB部分下,还选中了NATIVE CODE复选框(应该已经选中ASP.NET)。

终于为我解决了。

注意:我正在使用Visual Studio 2017专业版。


0

我不确定这是否还会对某人有所帮助,但是我已经完成了上面所有的解决方案(以及从其他贴子中获得的解决方案),但无济于事。

解决此问题的方法是在web.config中的RedirectUri值的末尾加反斜杠(疯狂,我知道!)。RedirectUri是UseOpenIdConnectAuthentication中的参数。

因此,代替:

<add key="ida:RedirectUri" value="https://www.bogussite.com/home" />

做这个:

<add key="ida:RedirectUri" value="https://www.bogussite.com/home/" />

并更新了Azure应用设置上的“回复URL”。

这样,启动程序就可以按预期运行(可能清除了某些缓存),并且现在触发了断点。

仅供参考。我正在从这里为我的代码建模:https//github.com/microsoftgraph/aspnet-connect-sample


0

一个类库转换为Web应用程序项目,我遇到了这一点,并成为固执。原来,在我的.csProj文件中,我有这个:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
  <DebugSymbols>true</DebugSymbols>
  <DebugType>full</DebugType>
  <Optimize>false</Optimize>
  <OutputPath>bin\Debug\</OutputPath>
  <DefineConstants>DEBUG;TRACE</DefineConstants>
  <ErrorReport>prompt</ErrorReport>
  <WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
  <DebugType>pdbonly</DebugType>
  <Optimize>true</Optimize>
  <OutputPath>bin\Release\</OutputPath>
  <DefineConstants>TRACE</DefineConstants>
  <ErrorReport>prompt</ErrorReport>
  <WarningLevel>4</WarningLevel>
</PropertyGroup>
  • 因此,将各种dll构建到bin文件夹的子文件夹中(ifc将不起作用)。解决方案是将两个文本内容都更改为OutputPathjust bin\

0

对我来说是因为它们不在同一个命名空间中。当我从“ project.Startup.AppStart”中删除我的AppStart并让它们都带有“ project.Startup”命名空间的Startup.cs和Startup.Auth.cs之后,一切都恢复正常。

希望对您有所帮助!


0

如果您在IIS托管中看到此问题,但是在F5调试时却没有,请尝试在IIS中创建一个新应用程序。

这为我解决了。(Windows 10)最后,我删除了“错误的” IIS应用程序,并重新创建了一个具有相同名称的相同应用程序。


0

我认为某些人想要达到的目标是,如果您要以编程方式使OWIN服务器“栩栩如生”,您将在调用类似以下内容:

using Microsoft.Owin.Hosting;

    IDisposable _server = WebApp.Start<StartupMethod>("http://+:5000"); 
              // Start Accepting HTTP via all interfaces on port 5000

进行此调用后,您将在调试器中看到对StartupMethod()的调用



0

这为我工作:

添加身份验证模式=“无”

<system.web>
    <compilation debug="true" targetFramework="4.6.1" />
    <httpRuntime targetFramework="4.6.1" />
      <authentication mode="None" /><!--Use OWIN-->
  </system.web>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.