当在IIS7中使用WAS时,全局.asax Application_Start的等效方法是什么?

34
我想在目前托管在IIS7上的WCF应用程序中使用netTcpBinding,这意味着需要配置为使用WAS。这是相当简单的,但是我的应用程序之前使用了全局.asax文件中的Application_Start事件。我不需要访问httpContext(我了解在IIS7中已经删除了访问权限),但我仍然想要挂钩启动或初始化方法?
在WAS中托管应用程序时,是否存在类似的功能?
使用经典模式不是一个选项(再次说明我不关心httpcontext,并且只有在使用http绑定时才有效),我看到过将静态类放置在app_code文件夹中的示例,但那个做法看起来很可怕。
2个回答

26

我相信 AppInitialize() 是你要找的方法。以下是一篇关于在WAS托管的WCF服务中使用它来初始化Castle Windsor的文章:

  

Castle Windsor和非HTTP协议的WCF服务

文章的精髓是,使用 Application_Start() 不会被WAS调用,所以需要使用AppInitialize()代替。

protected void Application_Start(object sender, EventArgs e)
{
   var container = new WindsorContainer("ioc.config");
   DefaultServiceHostFactory.RegisterContainer(container.Kernel);
}

使用:

public class InitialiseService
{
   /// <summary>
   /// Application initialisation method where we register our IOC container.
   /// </summary>
   public static void AppInitialize()
   {
      var container = new WindsorContainer("ioc.config");
      DefaultServiceHostFactory.RegisterContainer(container.Kernel);
   }
}

引用Matt的话:

我承认我花了一些时间仔细查看Host Factory,想要封装DefaultServiceHostFactory。然而,有一个更简单的解决方案,那就是利用很少被记录的AppInitialize方法。如果您创建一个类(任何类),将其放入项目的ASP.NET App_Code文件夹中,并按照下面定义的方法签名来定义一个方法,这个小东西将会在您想要时精确地触发。然后,您可以在其中初始化您的IoC容器。


谢谢回复。我之前看到过这个,但是它看起来相当“hacky”(不太正规)...我真的没想到我得依赖于app_code文件夹....难道真的没有其他合适的替代品吗? - Mike Tours
但是似乎被VS Web服务器(也称为Casini,ASP.NET开发服务器)忽略了。 - abatishchev
@abatishchev - 针对IIS Express怎么处理? - Kev
一样的。我必须开发自己的WCF扩展,使其在服务运行的主机下工作。奇怪。想知道为什么没有这样的内置功能。 - abatishchev

13

AppInitialize是一种有效的初始化服务的方法。但是本文介绍了一些其他可能更适合您的方法:如何初始化托管的WCF服务

注意:原始链接已失效。上面的链接是archive.org上的备份。


谢谢Graham - 我还没有机会查看这段代码以验证它,但是这篇文章看起来比依赖其他hacky解决方案更好。 - Mike Tours
Application_Start 运行一次整个应用程序。使用像您提到的服务工厂将每个服务运行一次,因此您需要额外的逻辑来防止代码运行两次。 - Nelson Rothermel
@grahamesd 在这个答案中提到的链接未找到,出现了404页面。 - Ashish Shukla
该文章也可以在这里找到。 - Chuck Lu

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