【问题标题】:Explicitly calling a service constructor when hosting a WCF web service on IIS在 IIS 上托管 WCF Web 服务时显式调用服务构造函数
【发布时间】:2011-06-08 13:08:53
【问题描述】:

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

<@ServiceHost Service="MyService" @>

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

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

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

注意:我知道许多解决方案都基于 Inversion of control (IoC) 和几个 IoC 框架,例如 UnityCastle ProjectSpring.NET。但是我根本不会真正使用它们。 WCF 可以自己做吗?我不能接受 WCF 不能让程序员通过以适当的方式构建服务来托管服务......

【问题讨论】:

    标签: c# .net wcf web-services iis


    【解决方案1】:

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

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

    这通常与构建对依赖注入的支持相同。您可以检查例如this article

    【讨论】:

    • 谢谢,我可以理解 ServiceHostFactory 的使用(我派生它是为了创建我的自定义服务主机的实例),使用自定义 ServiceHost 来托管服务,但是我不能创建与 IServiceBehavior 和 IInstanceProvider 的关系...你能举个例子吗?同样在伪代码中,我不明白我是否必须使用 IServiceBehaviour 或 ServiceBehaviorAttribute...
    • 嗯,我看到了几个互联网页面...但是有必要使用 IoC 框架来使这个东西工作吗?我只想为我的服务调用一个构造函数……真的有那么难吗??? WCF 可以自己做吗????
    • 我的回答中链接了示例。您不需要 IoC,但使其工作的方法是相似的。没有 WCF 调用默认构造函数,因为它不知道自定义构造函数所需的参数。
    • 请你放一小段代码来总结一下?我可能会尝试,但我无法完成这项工作,您的链接示例在某些时候对我没有帮助我无法将我的服务主机和其他所有内容放在一起......
    • @Andry:在您的问题中发布您已经拥有什么以及您在哪里有问题。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如果您只需要在您的服务中调用特定的构造函数,那么您只需要实现一个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() {
              ...
          }
         ...
      }
      

      更多信息在这里:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-13
        • 2012-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        相关资源
        最近更新 更多