OwinStartup 未触发

Posted

技术标签:

【中文标题】OwinStartup 未触发【英文标题】:OwinStartup not firing 【发布时间】:2013-11-25 21:45:17 【问题描述】:

我的 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 添加一个新的,使用 Add New Item 中的 OWIN Startup Class 类型,这也没有被调用。接下来我尝试添加第二个 Startup 类,因为我知道如果定义了多个 OwinStartup 属性,它将引发异常,但它不会在那里引发任何异常。

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

更新

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

【问题讨论】:

您是否在此应用程序中安装了 Microsoft.Owin.Host.Systemweb 包。确保这个 dll 也是 bin 文件夹的一部分? 就是这样。非常感谢。我认为发生的事情是我在某些时候使用 Resharper 删除了未使用的引用,并且它认为不需要一个。如果您想将此作为答案,我肯定会将其标记为解决方案。感谢您的帮助。 Jeff,ReSharper 删除了对 Microsoft.Owin.Host.Systemweb 的“未使用”引用 - 您是在谈论“使用”声明吗? Startup.cs 在哪个文件中? 我遇到了完全相同的问题,resharper 删除了对 Microsoft.Owin.Host.SystemWeb 的引用。我通过在 Visual Studio 中打开包管理器控制台窗口并运行以下命令来修复它 PM> Update-Package -reinstall Microsoft.Owin.Host.SystemWeb 作为@JoeKing 上述评论的更新。 PM 控制台不会更新为“未找到”。我不得不去重新安装。 PM> Install-Package Microsoft.Owin.Host.SystemWeb 【参考方案1】:

确保你已经在项目中安装了Microsoft.Owin.Host.SystemWeb 包。 IIS 托管应用程序中的启动检测需要此包。更多信息可以参考this article。

【讨论】:

假设我们有一个地方可以调用 Owin 启动检测 (PreApplicationStartMethod),而不需要 Microsoft 的这些直接引用,那么有人如何以编程方式在消耗/owin 封装库中启动 Owin 启动检测。欧文的东西?我们具体怎么挑衅Katana打电话给Startup.Configuration(IAppBuilder) 尝试从头开始创建应用程序,而不使用 MVC 模板。这结束了 2 小时的绝望。 就在我大喊 resharper 是最大的生产力杀手时,我遇到了这个问题,并且无法弄清楚为什么 web api 停止工作了一周。另一个证明 reshaper 正在扼杀我的工作效率。 要求引用一个在编译过程中没有真正使用的库是微软的一个糟糕的设计! Resharper 正在尽力而为,但没有任何武器可以对付这种糟糕的决定。 太棒了。每次我添加 OWIN 启动文件时都会遇到这个问题。每次我忘记原因,最后都会得到这个答案。【参考方案2】:

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

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

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

改为true

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

我知道你已经提到了这一点,但有时人们(比如我)并没有阅读整个问题,而是直接跳到答案...

在某个地方——当我升级到 MVC 5 时,它被添加了,直到今天我才看到它。

【讨论】:

在旧的 mvc 项目中实现 Owin 启动类时遇到了同样的问题。切换值就行了!【参考方案3】:

讨论的原始问题的替代答案 - Owin“不射击”。就我而言,我花了几个小时认为它没有触发是因为无法在其中设置断点。

在 Visual Studio 中调试 OWIN 启动时

IIS Express - 运行“F5”会中断 OWIN 启动代码

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

【讨论】:

你是对的!这只是 Visual Studio 2013 调试器没有在 Startup 类内的断点处停止 - 在本地 IIS 下运行时。很奇怪。 您能否详细说明“附加到 W3P.exe”?我有同样的问题,即断点没有被 IIS 击中,但被 IISExpress 击中。我已经停止了应用程序,附加到 w3wp.exe,然后浏览到我的本地主机,但它仍然没有被击中。我错过了什么吗? 我也无法附加到我的应用程序的运行实例,尽管我相信我以前能够这样做。我尝试在浏览器中打开一个应用程序,然后在 VS2013 中使用“调试-> 附加到进程”,然后在浏览器中重新加载页面。 VS没有停下来。我知道 OWIN Startup 正在执行:我将一些日志记录放入其中以进行调试。这就像回到了中间调试打印的黑暗时代。 一位同事刚刚告诉我,在 iis 中,如果您双击默认应用程序池并将托管管道模式更改为经典,调试器将在启动时中断。我在那之后运行并得到一个错误,说应用程序必须在集成中运行,所以我不得不将它改回来,但至少能够看到它在那里中断。 这里有几件事。 “w3wp.exe”基于应用程序池。如果您的应用程序不是您请求启动该进程的第一个应用程序,您应该能够调试 global.asax 和 owin。即在应用程序池中请求不同的应用程序,“附加到 w3wp.exe”,然后请求您尝试调试的应用程序。【参考方案4】:

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

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

【讨论】:

这正是正在发生的事情。附加调试器后是否有解决方案让 Startup 类触发? 我可以知道如何在配置方法中抛出异常吗? 在 Startup.cs 中加入这一行来证明它被执行了:System.IO.File.WriteAllText(@"c:\temp\startup.txt", "Started"); @Karthikeyan - 在 ConifureAuth(app) 之前(无关紧要)之后添加此行; line - throw new Exception("Hello"); 制作第一行 System.Threading.Sleep(10_000) 以便在继续之前等待足够长的时间让调试器附加(根据需要调整)【参考方案5】:

调试提示

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

使用本地 IIS

由于某种原因,此方法启用了此方法的调试:

    请求网页 附加到 w3wp.exe 进程 触摸 web.config 文件 请求网页

额外提示

也许这样做会刷新缓存:

    在 web.config 中添加带有 false 值的 optimizeCompilations 属性

    运行站点

    撤消 web.config 中的更改

【讨论】:

切换设置 optimizeCompilations="false" 对我有用 你拯救了我的一天! optimizeCompilations="false" 为我工作。 optimizeCompilations 拯救了我的一天。谢谢:)【参考方案6】:

我遇到了类似的问题,清除临时 ASP.NET 文件修复了它。希望这对某人有所帮助。

【讨论】:

仅供参考,这是另一个答案,提供了有关这些文件存储位置的更多详细信息:***.com/questions/16137457/… 我运行 IIS EXPRESS 和窗口 8:在此处删除:C:\Users\Your User Name\AppData\Local\Temp\Temporary ASP.NET Files\vs 谢谢,我注意到了这个答案,因为在此之前我有一个错误,关于锁定临时 ASP.NET 文件文件夹中的文件 我为此苦苦挣扎了一整天,最后这对我有用。清除Temporary ASP.NET Files 文件夹内容后,Owin 启动被调用。【参考方案7】:

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

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

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

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

【讨论】:

我已经为此奋斗了一段时间,这就是解决我的问题的原因。我在 packages.config 中有 nuget 引用,但我的 csproj 没有引用。 就我而言,我根本没有安装该软件包。运行 install-package Microsoft.Owin.Host.SystemWeb 解决了我的问题。感谢您的提示。【参考方案8】:

当我将 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>

【讨论】:

我有一个 sitecore 项目,在我的 web.config 文件中,没有 标签。但是添加 解决了我的问题。 谢谢@burki,因为你的评论,我强迫自己尝试这个解决方案,它也对我们有用!自 VS 更新到 15.9.9 后,Owin 启动类没有触发。 非常感谢!这解决了它,我必须添加以下内容: 【参考方案9】:

在我的例子中,这个 Microsoft.Owin.Host.SystemWeb 包存在于项目中。

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

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

添加它们后,它运行顺利。

【讨论】:

【参考方案10】:

在我的例子中,IIS 应用程序池未设置为 v4。它是 v2。

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

【讨论】:

【参考方案11】:

就我而言,我的 web.config 有

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

为了迫使它回到欧文,我需要它

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

【讨论】:

对我来说没有任何允许用户,但设置为拒绝解决了问题【参考方案12】:

在我的例子中,我的网站的输出路径被某人更改了,IIS Express 甚至没有加载 OWIN,当然也不会命中设置类。我将输出路径设置为“bin\”后,效果很好。

【讨论】:

【参考方案13】:

我不确定这是否仍会帮助某人,但我已经完成了上述所有解决方案(以及其他一些帖子),但无济于事。

解决这个问题的方法是在 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

【讨论】:

【参考方案14】:

converting a class library to a Web Application Project之后,我遇到了这个,变得固执。结果,在我的.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. 不起作用)。解决方案是将 OutputPath 的两个文本内容都更改为 bin\

【讨论】:

【参考方案15】:

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

希望对你有帮助!

【讨论】:

【参考方案16】:

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

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

【讨论】:

【参考方案17】:

我认为有些人试图达到以上目的是,如果您想以编程方式使您的 OWIN 服务器“栩栩如生”,您会调用这样的东西:

using Microsoft.Owin.Hosting;

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

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

【讨论】:

【参考方案18】:

我发现以下文章非常有帮助:

https://weblog.west-wind.com/posts/2015/Apr/29/Adding-minimal-OWIN-Identity-Authentication-to-an-Existing-ASPNET-MVC-Application#MinimalCodeSummary

在我的例子中,我必须在 Owin 身份验证而不是 Windows 身份验证之前设置以下内容:

<system.web>   
    <authentication mode="None" />   
<system.web>

【讨论】:

【参考方案19】:

这对我有用:

添加认证模式="无"

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

【讨论】:

【参考方案20】:

如果您的解决方案中有多个主机使用相同的命名空间,请确保将它们放在单独的 IISExpress 端口上(并删除 .vs 文件夹并重新启动 vs)。

【讨论】:

【参考方案21】:

我在这篇文章中提出了很多建议。

我有以下问题,但仍然无法降落在断点上。抛出异常证明正在输入代码。

<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 Professional。

【讨论】:

【参考方案22】:

首先添加 OWIN Auth 类,然后在您的 web.config 中启用 OWIN:AutomaticAppStartup 键,例如 现在它会开火

【讨论】:

以上是关于OwinStartup 未触发的主要内容,如果未能解决你的问题,请参考以下文章

如何定义一个有效的OWIN Startup Class

对预检请求的响应未通过访问控制(Angular 2 - Web Api)

OWIN Startup 类与 WebAPIConfig.Register 方法一起执行

signalR

Swagger 在 OWIN Startup Web API C# 中不起作用

1.6 OWIN集成