IIS上承载的WCF服务的输入方法是什么?

IIS上承载的WCF服务的输入方法是什么?,wcf,iis,azure,singleton,initialization,Wcf,Iis,Azure,Singleton,Initialization,一点背景资料- 我正在尝试在Azure上托管RESTful WCF服务。据我所知,除非我在角色上有ASP.NET类型的宿主,否则我并不真正需要global.asax类(它有application\u start方法) 从基本原型设计开始,我只需要svc文件及其背后的实现,它会在角色启动时自动初始化(我的意思是,托管在IIS上)。这很好,因为除了web.config之外,我不需要额外的代码,而且我的服务已经启动并运行。我不需要创建新的服务主机并开始侦听它,等等。我可以部署角色并将消息发布到我的服务

一点背景资料- 我正在尝试在Azure上托管RESTful WCF服务。据我所知,除非我在角色上有ASP.NET类型的宿主,否则我并不真正需要global.asax类(它有application\u start方法)

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

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


如果没有显式的应用程序启动方法和配置为单例的服务,我是否可以假设当第一个请求传入时,会调用我的服务构造函数?(以及所有自定义初始化?。

您正在查找ServiceHostFactory。您可以向SVC文件中添加一个部件以使用工厂,在工厂中您可以执行任何可能需要的日志记录等操作

我在过去使用它来启动一个后台工作程序,为一些后台工作启动一个单独的线程

希望这能帮助你达到你需要的地方。:)

我可以假设当第一个请求传入时,我的服务构造函数会被调用吗

是的,但是你应该问问自己,你是否真的希望你的服务以单身的身份运行。如果你对此感到满意,那么它会工作得很好;如果你不想让它作为一个单例运行,那么你应该使用一个定制工厂来研究Russell的答案

请看一些关于WCF服务是否应该是单例的讨论。您需要根据自己的情况做出决定,但通常WCF服务不是单例服务,除非需要

要实现自定义工厂,请参阅此MSDN链接。正如链接所描述的,像这样扩展服务主机工厂

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" %>


谢谢Russell,这很有帮助。不过,我还有一个后续问题。派生工厂不会取代我的服务实现,对吗?我仍然保留代码,位于x.svc.cs中,派生工厂只允许我在当前进程中启动线程/作业?正确,工厂用于帮助主机启动进程。服务主机仍将在.svc文件等中启动服务合同设置。谢谢Kirk。我考虑让它成为单身汉的唯一原因就是我上面提到的原因。我只需要初始化日志类的一个实例,所有请求实例都可以共享该实例……最简单的方法似乎是将服务类设置为单例,并重载构造函数来完成我想要的任务。读到更多关于使用单例服务的负面影响的文章,我意识到这可能不是最好的主意。不过我还有一个后续问题。。DerivedFactory不会替换我在x.svc.cs中的代码,对吗?你是对的,
DerivedFactory
是一个你必须编写的新类。如果您想将逻辑放入构造函数中,那么单例模式是确保构造函数只被调用一次的简单方法,这是正确的,而且它是有效的。只要确保你很高兴有一个单身汉!令人惊叹的!谢谢你的帮助。