一些背景信息 - 我正在尝试在Azure上托管RESTful WCF服务。据我所知,除非我在角色上有ASP.NET类型托管,否则我真的不需要global.asax类(它有application_start方法)。
从基本原型开发,我需要的只是svc文件及其背后的实现,它会自动在角色启动时初始化(我的意思是,在IIS上托管)。这很好,因为除了web之外我不需要额外的代码。配置和我的服务已启动并运行。我不需要创建新的服务主机并开始监听它等等。我可以将角色和POST消息部署到我的服务中。
问题 - 我实现了自定义日志记录和初始化类,我需要在服务启动时进行初始化。我将我的服务配置为单例,我不确定应该在哪里放置自定义初始化组件。
如果没有显式的应用程序启动方法和我的服务配置为单例,我可以假设当第一个请求进入时,我的服务构造函数被调用吗? (以及我的所有自定义初始化?)。
答案 0 :(得分:2)
您正在寻找ServiceHostFactory。您可以将一个部件添加到SVC文件以使用工厂,您可以在其中执行您可能需要的任何日志记录等。
我过去曾使用过这个来启动后台工作程序来为一些后台工作启动一个单独的线程。
http://msdn.microsoft.com/en-us/library/system.servicemodel.activation.servicehostfactory.aspx
希望这有助于您获得所需的目标。 :)
答案 1 :(得分:2)
我可以假设当第一个请求进来时,我的服务构造函数会被调用吗?
是的,但您应该问问自己,您是否真的希望自己的服务作为单身人士运行。如果你对此感到满意,那么它会正常工作;如果你不希望它作为单身人士运行,那么你应该使用自定义工厂来研究Russell的答案。
关于WCF服务是否应该是单身的讨论,请参阅Should WCF service typically be singleton or not?。你需要决定你的情况,但一般 WCF服务不是单身人士,除非他们需要。
要实施自定义工厂,请参阅此MSDN链接Extending Hosting Using ServiceHostFactory。如链接所述,扩展服务主机工厂,如此
public class DerivedFactory : ServiceHostFactory
{
public override ServiceHost CreateServiceHost( Type t, Uri[] baseAddresses )
{
return new ServiceHost(t, baseAddresses )
}
}
然后在ServiceHost指令
中指定您的工厂<% @ ServiceHost
Service="MyNamespace.MyService"
Factory="MyNamespace.DerivedFactory" %>