在IIS上承载WCF web服务时显式调用服务构造函数

本文关键字:服务 调用 构造函数 web IIS WCF | 更新日期: 2023-09-27 17:58:44

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

为了做到这一点,我创建了我的服务:

// 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文件(为我的服务提供基本地址的好方法):

<@ServiceHost Service="MyService" @>

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

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

PS:我知道可以指定HostServiceFactory。这是我应该在这里用的东西吗?它还给了我工厂和一个主机。对于主机,我无法对主机传递的参数执行操作。但是,我该如何解决这个问题?

注:我知道许多解决方案都是基于控制反转(IoC)和几个IoC框架,如Unity、Castle Project和Spring。NET。然而,我根本不会真正使用它们。WCF能自己做到这一点吗?我不能接受WCF不能让程序员通过以适当的方式构建服务来托管服务。。。

在IIS上承载WCF web服务时显式调用服务构造函数

您必须编写几个自定义类来支持创建带参数的服务:

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

这通常与构建对依赖项注入的支持相同。例如,你可以查看这篇文章。

看看Castle WCF设施(我在生产中使用这个)或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<ServiceEndpoint> 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)
    {}
}

具有自定义ServiceBehavior属性的MyService

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

更多信息请点击此处:

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