【问题标题】:What is the entry method for WCF service hosted on IIS?IIS上托管的WCF服务的入口方法是什么?
【发布时间】:2011-10-16 23:09:37
【问题描述】:

一些背景信息 - 我正在尝试在 Azure 上托管 RESTful WCF 服务。据我了解,除非我在角色上托管 ASP.NET 类型,否则我真的不需要 global.asax 类(它具有 application_start 方法)。

从基本原型设计开始,我只需要 svc 文件及其背后的实现,它会在角色启动时自动初始化(我的意思是,托管在 IIS 上)。这很棒,因为除了 web 之外我不需要额外的代码。 config 并且我的服务已启动并正在运行。我不需要创建新的服务主机并开始监听它等。我可以将角色和 POST 消息部署到我的服务。

问题 - 我已经实现了自定义日志记录和初始化类,我需要在服务启动时对其进行初始化。我将我的服务配置为单例,但我不确定应该将自定义初始化组件放在哪里。

如果没有明确的应用程序启动方法并且我的服务配置为单例,我是否可以假设当第一个请求进来时,我的服务构造函数被调用? (连同我所有的自定义初始化?)。

【问题讨论】:

    标签: wcf iis azure singleton initialization


    【解决方案1】:

    我可以假设当第一个请求进来时,我的服务构造函数被调用了吗?

    是的,但是您应该问自己是否真的希望您的服务作为单例运行。如果您对此感到满意,那么它将正常工作;如果您不希望它作为单例运行,那么您应该使用自定义工厂查看 Russell 的答案。

    查看Should WCF service typically be singleton or not?,了解有关 WCF 服务是否应该是单例的一些讨论。您需要根据自己的情况做出决定,但通常除非需要,否则 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" %>
    

    【讨论】:

    • 谢谢柯克。我什至考虑将其设为单例的唯一原因是我上面提到的原因。即。我只想要初始化所有请求实例都可以共享的日志类的一个实例……而最简单的方法似乎是使服务类成为单例并重载构造函数以执行我想要的操作。阅读更多关于使用单例服务的缺点,我意识到这可能不是最好的主意。不过我确实有一个后续问题.. DerivedFactory 不会替换我在 x.svc.cs 中的代码,对吗?
    • 你是对的 - DerivedFactory 是一个你必须编写的新类。而且你是正确的,单例模式是一种确保构造函数被调用一次的简单方法,如果你想在构造函数中放入逻辑 - 它是有效的。只要确保你很高兴有一个单身人士!
    • 太棒了!感谢所有帮助。
    【解决方案2】:

    您正在寻找 ServiceHostFactory。您可以将零件添加到 SVC 文件以使用工厂,您可以在工厂中执行您可能需要的任何日志记录等。

    我过去曾用它来启动一个后台工作程序,以启动一个单独的线程来进行一些后台工作。

    http://msdn.microsoft.com/en-us/library/system.servicemodel.activation.servicehostfactory.aspx

    希望这可以帮助您到达需要的地方。 :)

    【讨论】:

    • 谢谢拉塞尔,这有帮助。不过,我确实有一个后续问题。派生工厂不会取代我的服务实现,对吗?我仍然有代码,坐在 x.svc.cs 和派生工厂只是让我在当前进程中启动一个线程/作业?
    • 正确,Factory 用于帮助主机启动过程。服务主机仍将启动 .svc 文件等中的服务合同设置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-13
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多