我有一个简单的应用程序,我使用 global.asax 通过 Application_Start 中的自定义 servicehostfactory 将 serviceroute 映射到 wcf 服务。该服务的构造函数会进行一些初始处理来设置需要一些时间的服务。
我需要这个构造函数在它的 serviceroute 被自动添加时触发。我尝试从 global.asax 创建一个客户端通道并进行虚拟调用以启动该服务,但发现该服务尚未启动 - 似乎 application_start 必须返回?
那么,如何在第一次通过 global.asax 映射时触发服务的构造函数,而无需手动点击服务?不幸的是 AppFabric 不是我们的选择,所以我不能只使用它的内置自动启动..
更新
我被要求提供更多细节;
这就像一个路由管理服务。所以我有 Service1——它被添加为 global.asax 中的服务路由。现在我有http://localhost/Service1
在 Service1 中,我有一个名为“addServiceRoute”的方法。调用时,它还会为 Service2 注册一个路由。现在我有http://localhost/Service1/Service2。
我最初的 global.asax 解决方案是为http://localhost/service1构建一个 channelfactory ,但这不起作用。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));
}