运行WebApi项目的OWIN SelfHost项目不调用Application_Start方法

Posted

技术标签:

【中文标题】运行WebApi项目的OWIN SelfHost项目不调用Application_Start方法【英文标题】:OWIN SelfHost project running WebApi project does not call Application_Start method 【发布时间】:2019-11-27 08:57:37 【问题描述】:

我在 Visual Studio 2019 中有一个包含两个项目的解决方案:

    一个C#类库(一个WebAPI项目) 一个C#控制台应用程序(一个OWIN SelfHost项目,参考项目1)

SelfHost 项目的唯一目的是 WebAPI可以在没有 Visual Studio 的情况下运行

当我在 Visual Studio 中运行 WebAPI 项目时,一切正常。提供静态内容,我可以通过浏览器调用它的 ApiControllers。

当我运行 SelfHost 项目时,浏览器无法调用/访问 ApiController。这可能是因为 Global.asax 中的以下代码没有被执行。 Application_Start 方法没有被调用:

public class WebApiApplication : System.Web.HttpApplication

    protected void Application_Start()
    
        GlobalConfiguration.Configure(WebApiConfig.Register);
    

因此,没有执行将控制器链接到 URI 的机制:

public static class WebApiConfig

    public static void Register(HttpConfiguration config)
    
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/controller/id",
            defaults: new  id = RouteParameter.Optional 
        );
    

所以症状可以解释,但如何解决? 我尝试通过从 SelfHost 项目手动调用 GlobalConfiguration.Configure 方法来解决此问题,但随后出现以下错误:

'在应用程序预启动期间不能调用此方法 初始化阶段。'

感谢任何帮助。

【问题讨论】:

您需要从使用 Application_Start 方法的“旧方式”迁移,并将您的初始化代码放入 Startup.cs。 是的,@Chris 是对的。如果您想使用 Owin 的自托管方法,请参阅 this 你在这里混淆了一些东西。您实际上是在创建 IIS 托管项目,而不是自托管项目。您肯定会看到 IIS Express 正在运行。 global.asax 根本不由 Katana 处理。从这里开始:dotnetcodr.com/2014/04/14/owin-and-katana-part-1-the-basics @ZorgoZ 有两个项目,一个是自托管的(如果你运行它,它会在系统托盘中启动 IIS),一个不是(它启动一个命令行应用程序 io IIS)。跨度> 【参考方案1】:

我通过将我的原始代码迁移到 WebAPI 2 方式解决了这个问题(正如 Chris Pickford 所建议的那样)。它现在写成如下并且有效:

Startup.cs:

public void Configuration(IAppBuilder app)

    ...
    var config = new HttpConfiguration();
    config.MapHttpAttributeRoutes();
    app.UseWebApi(config);
    ...
 

【讨论】:

以上是关于运行WebApi项目的OWIN SelfHost项目不调用Application_Start方法的主要内容,如果未能解决你的问题,请参考以下文章

WEB API 2,Selfhost,除“localhost”外的所有内容都拒绝访问

Self-Host

SignalR.Owin 与 SignalR.SelfHost

asp.net web api 自托管 / owin / katana

当使用 SelfHost 的 OWIN 承载 SignalR 时,重启 OWIN 后,SignalR 不能正常工作

OWIN WebAPI如何自动生成接口文档