【问题标题】:WCF on IIS: Passing data from a ServiceHostFactory to the Service instancesIIS 上的 WCF:将数据从 ServiceHostFactory 传递到服务实例
【发布时间】:2010-11-10 11:38:37
【问题描述】:

我有一个托管在 IIS 上的 WCF 应用程序。 我正在自定义 ServiceHostFactory 中初始化 IoC 容器。

基本上,我希望能够将该 IoC 容器“注入”到在该 ServiceHost 范围内创建的每个服务实例。

你将如何做到这一点?

爱丽儿

【问题讨论】:

    标签: iis wcf


    【解决方案1】:

    就像你说的,你需要一个自定义的 ServiceHostFactory 来创建你的服务。像这样的:

    公共类 SessionPerCallServiceHostFactory : ServiceHostFactory { 公共 SessionPerCallServiceHostFactory() { } protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) { 返回新的 SessionPerCallServiceHost(serviceType, baseAddresses); } }

    您还需要一个 ServiceHost 来负责创建必要的服务:

    公共类 SessionPerCallServiceHost : ServiceHost { 公共 SessionPerCallServiceHost() { } 公共 SessionPerCallServiceHost(类型 serviceType,参数 Uri[] baseAddresses) :基地(服务类型,基地地址) { } 受保护的覆盖无效 OnOpening() { Description.Behaviors.Add(new SessionPerCallServiceBehavior()); base.OnOpening(); } }

    使用 IServiceBehavior 的自定义实现,它将能够提供用于创建服务实例的 InstanceProvider:

    公共类 SessionPerCallServiceBehavior : IServiceBehavior { public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { foreach(serviceHostBase.ChannelDispatchers 中的 ChannelDispatcherBase cdb) { ChannelDispatcher cd = cdb 作为 ChannelDispatcher; 如果 (cd != null) { foreach(在 cd.Endpoints 中编辑的 EndpointDispatcher) { ed.DispatchRuntime.InstanceProvider = 新的 SessionPerCallInstanceProvider(serviceDescription.ServiceType); } } } } public void AddBindingParameters(ServiceDescription serviceDescription,ServiceHostBase serviceHostBase,集合端点,BindingParameterCollection bindingParameters) { } 公共无效验证(ServiceDescription serviceDescription,ServiceHostBase serviceHostBase) { } }

    最后是实例提供者,它允许您使用 IoC 在请求的服务实例中注入您想要的任何内容:

    公共类 SessionPerCallInstanceProvider : IInstanceProvider { 私有只读类型_serviceType; 公共 SessionPerCallInstanceProvider(类型 serviceType) { _serviceType = 服务类型; } 公共对象 GetInstance(InstanceContext instanceContext, System.ServiceModel.Channels.Message 消息) { //我创建它没有任何技巧,但你可以在这里使用你的 IoC 容器 返回 Activator.CreateInstance(_serviceType); } 公共对象 GetInstance(InstanceContext instanceContext) { 返回 GetInstance(instanceContext, null); } public void ReleaseInstance(System.ServiceModel.InstanceContext instanceContext, 对象实例) { } }

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 2012-08-19
      • 2020-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多