gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:12:12 26 4
gpt4 key购买 nike

我有一个简单的应用程序,我使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com