asp.net - 如何让服务从 global.asax 启动而无需调用它?

标签 asp.net wcf c#-4.0 wcf-client

我有一个简单的应用程序,我使用 global.asax 通过 Application_Start 中的自定义 servicehostfactory 将服务路由映射到 wcf 服务。该服务的构造函数会执行一些初始处理来设置服务,这需要一些时间。

我需要在自动添加其服务路由时触发此构造函数。我尝试从 global.asax 创建一个 clientchannel 并进行虚拟调用来启动服务,但发现服务尚未启动 - 似乎 application_start 必须返回?

那么,如何在首次通过 global.asax 映射时触发服务的构造函数,而无需手动点击服务?不幸的是 AppFabric 不适合我们,所以我不能只使用它的内置自动启动..

更新

有人要求我提供更多细节;

这就像一个路由管理服务。所以我有 Service1——它被添加为 global.asax 中的服务路由。现在我有http://localhost/Service1

在 Service1 中,我有一个名为“addServiceRoute”的方法。调用时,它还会注册 Service2 的路由。现在我有http://localhost/Service1/Service2 .

我从 global.asax 得到的最初解决方案是构建一个到 http://localhost/service1 的 channel 工厂。但这是行不通的。 Service1 尚未启动,直到 Application_Start 返回后才会启动(仍然不确定为什么?)。所以我想我应该作弊并将最初的 addserviceroute 调用移至 service1 的构造函数。也没用。

有人提到这不应该出现在构造函数中——我同意,这只是测试代码。

还提到了单例,这可能没问题,但我打算在一台计算机上(在同一个应用程序池中)拥有多个 Service1 实例,所以我认为这行不通?

** 更新 #2 ** 我被要求提供示例代码..这里它来自 global.asax (为了简洁而进行了一些修剪)..所以 http://localhost/Test确实出现了..但是如果我必须使用appfabric来预热Test并让它的构造函数启动,那么我不需要Test.svc之类的东西吗?我怎样才能让appfabric看到这个服务的存在?

protected void Application_Start(object sender, EventArgs e)
        {
            RouteTable.Routes.Ignore("{resource}.axd/{*pathInfo}");
            RouteTable.Routes.Add(
                new ServiceRoute("Test", new MyServiceHostFactory(ITestService, BindingType.BasicHttpBinding, true), TestService)); 
        }

最佳答案

您所描述的需要单例服务(您应该避免),因为通常每个调用或 session 都会获得一个新实例=对构造函数的新调用。在自托管 WCF 服务中,您可以实例化单例服务实例并将其传递给 ServiceHost 构造函数。如果 IIS 托管服务与 ServiceRoute 一起使用,您可以尝试创建自己的从 ServiceHostFactory 派生的类,并将创建的服务实例作为参数传递给其构造函数。在此工厂类中实现 CreateServiceHost 方法并将现有服务实例传递给 ServiceHost 构造函数。为了使这项工作有效,您的服务类仍必须按 singleton through service behavior 处理。 .

顺便说一句。构造函数不应该做任何耗时的操作。构造函数用于构造对象而不是初始化基础设施。首先,使用构造函数进行此类初始化是不好的做法。

关于asp.net - 如何让服务从 global.asax 启动而无需调用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10067672/

相关文章:

c# - DataContract 类中的 WCF 私有(private)成员引用变为 NULL

c# - REST API 中对象的设计模式?

c# - 从 ASP.NET 客户端更新 SQL 数据库

c# - 使用 Reflection.Emit 调用基类方法

c# - 如何在 Visual Studio 中为 nuget 包创建离线存储库

wcf - 从 Silverlight 应用实例化和关闭支持 Silverlight 的 WCF 服务的最佳位置在哪里?

c# - 如何以编程方式切换样式表?

c# - Entity Framework POCO - 更新集合

visual-studio - 代码覆盖率结果中缺少类文件

c# - AjaxFileUpload获取文件流