在IIS上托管WCF Web服务时显式调用服务构造函数

我想在Microsoft IIS(IIS主机)上托管我的WCF服务。

为此,我创建了我的服务:

// The service public class MyService : IMyService { // Ctors public MyService() { // Def ctor: I don't want to call it } public MyService(...) : this() { // Parametric ctor, I want to call it! } ... } // The contract [ServiceContract] public interface IMyService { ... } 

我创建了一个svc文件(一种为我的服务提供基地址的好方法):

  

但是这样做,当托管我的服务(只是在IIS中创建一个指向我的应用程序所在的文件夹的虚拟目录,通常是项目目录)时,IIS将调用默认构造函数。

如何使IIS调用不同的构造函数?

PS:我知道可以指定一个HostServiceFactory 。 这是我应该在这里使用的吗? 它让我回到工厂和主人。 对于主机,我无法对主机传递的参数进行操作。 但是,我该如何解决这个问题呢?

注意:我知道许多解决方案都基于控制反转 (IoC)和几个IoC框架,如Unity , Castle Project和Spring.NET 。 但是我根本不会真正使用它们。 WCF可以独立完成吗? 我不能接受WCF不能让程序员通过以适当的方式构建服务来托管服务……

您必须编写多个自定义类以支持使用参数创建服务:

  • 实现IInstanceProvider自定义类。 该类将负责使用非默认构造函数创建服务实例。
  • 实现IServiceBehavior自定义类。 该类将负责将自定义实例提供程序添加到端点调度程序中。
  • 自定义ServiceHost将应用您的行为。
  • 自定义ServiceHostFactory将实例化您的自定义服务主机。 您将从.svc文件引用此工厂。

这通常与构建dependency injection支持相同。 您可以查看本文的示例。

看看Castle WCF Facility (我在生产中使用这个)或Autofac WCF集成

如果你只需要在服务中调用一个特定的构造函数,那么你只需要实现一个IInstanceProvider并将一个IServiceBehavior附加到你的服务:

IInstanceProvider

 public class ServiceInstanceProvider : IInstanceProvider { public object GetInstance(InstanceContext instanceContext) { return this.GetInstance(instanceContext, null); } public object GetInstance(InstanceContext instanceContext, Message message) { return new MyService(...); } public void ReleaseInstance(InstanceContext instanceContext, object instance) {} } 

IServiceBehavior作为属性

 public class InstanceProviderBehaviorAttribute : Attribute, IServiceBehavior { public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection endpoints, BindingParameterCollection bindingParameters) {} public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { foreach (ChannelDispatcher cd in serviceHostBase.ChannelDispatchers) { foreach (EndpointDispatcher ed in cd.Endpoints) { if (!ed.IsSystemEndpoint) { ed.DispatchRuntime.InstanceProvider = new ServiceInstanceProvider(); } } } } public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) {} } 

MyService与自定义ServiceBehavior属性

 [InstanceProviderBehavior] public class MyService : IMyService { public MyService() { } public MyService(...) : this() { ... } ... } 

有关这方面的更多信息:

  • Carlos Figueira MSDN博客:WCF可扩展性 – IInstanceProvider
  • Carlos Figueira MSDN博客:WCF可扩展性