运行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”外的所有内容都拒绝访问
SignalR.Owin 与 SignalR.SelfHost
asp.net web api 自托管 / owin / katana