C# 如何在非&x27;的WCF服务库中执行初始化;你不能自己主持吗?

C# 如何在非&x27;的WCF服务库中执行初始化;你不能自己主持吗?,c#,.net,wcf,visual-studio-2008,C#,.net,Wcf,Visual Studio 2008,我已经创建了一个WCF服务库,其中包含一个简单的“hello world”测试服务和一个正确配置的App.config文件,以便在启动客户端应用程序时,通过Visual Studio的内置主机启动WCF服务。目前的服务与客户端中的外部配置配合良好 我需要运行一些初始化代码来设置DI、数据访问、日志记录等。我已经编写了一个控制台主机,可以做到这一点,服务本身最终将部署为Windows服务,但我希望使用内置主机,这样我就不必在开发过程中手动重新启动服务 是否有某种方法可以在库中挂接一些代码以在启动时

我已经创建了一个WCF服务库,其中包含一个简单的“hello world”测试服务和一个正确配置的App.config文件,以便在启动客户端应用程序时,通过Visual Studio的内置主机启动WCF服务。目前的服务与客户端中的外部配置配合良好

我需要运行一些初始化代码来设置DI、数据访问、日志记录等。我已经编写了一个控制台主机,可以做到这一点,服务本身最终将部署为Windows服务,但我希望使用内置主机,这样我就不必在开发过程中手动重新启动服务


是否有某种方法可以在库中挂接一些代码以在启动时调用?

在实现服务的类的静态构造函数中包含初始化代码是否可行

public class WCFService : IWCFService
{
    static WCFService()
    {
        // do initializing here
    }

}

此代码将在第一次调用服务时执行。

在实现服务的类的静态构造函数中包含初始化代码是否有效

public class WCFService : IWCFService
{
    static WCFService()
    {
        // do initializing here
    }

}

此代码将在第一次调用服务时执行。

我发现了关于使用的另一个问题,该问题是通过
*.svc
文件设置的
*.svc
文件是WCF服务应用程序的一部分,不能由WCF服务库直接使用。我希望在实现服务和最终的生产托管时坚持使用服务库,以获得一定的灵活性,但使用WCF服务应用程序将以适合开发的方式完成工作(并且可能很容易访问IIS,使用一组备用配置进行生产托管)。所以我想我只需要创建一个WCF服务应用程序,作为服务库中服务的主机,并执行所需的初始化

我首先创建了一个新的WCF服务应用程序,删除了VS创建的默认服务文件,并添加了对现有服务库和其他依赖项的引用

在服务应用程序的
Web.Config
文件中,在
.
部分(必须是
标记后的第一个节点)下,我为服务库添加了
部分(可以从服务库中的
app.Config
文件中提取并根据需要进行编辑)

例如:

<system.serviceModel>
  <services>
    <service behaviorConfiguration="MyServiceBehavior" name="BelfryImages.QueryService.Implementation.HelloWorld">
      <endpoint address="HelloWorld" binding="wsHttpBinding" name="HelloWorld" contract="BelfryImages.QueryService.Contracts.IHelloWorld" />
    </service>
  </services>

  <behaviors>
    <serviceBehaviors>
      <behavior name="MyServiceBehavior">
        <serviceMetadata httpGetEnabled="true" />
        <serviceDebug includeExceptionDetailInFaults="true" />
      </behavior>
    </serviceBehaviors>
  </behaviors>

  <bindings>
  </bindings>
</system.serviceModel>
在第一次从
http://localhost:XXXXX/QueryService/HelloWorld
http://localhost:XXXXX/HelloWorld.svc/HelloWorld

然后,我创建了
ServiceHostFactory
,以对服务执行初始化。我发现一篇MSDN文章()解释了(清单5-6和5-7)-出于我的目的,我刚刚添加了一个更简单、通用的
CustomHostFactory
类:

public class CustomHostFactory
    : ServiceHostFactory
{
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {
        // perform initialisation:
        ...

        var serviceHost = base.CreateServiceHost(serviceType, baseAddresses);
        return serviceHost;
    }
}
然后,通过添加
工厂
属性,将其绑定到
.svc
文件中的服务:

<%@ ServiceHost Language="C#" Debug="true" Service="BelfryImages.QueryService.Implementation.HelloWorld" Factory="BelfryImages.WcfService.CustomHostFactory" %>


通常在创建服务之前,将执行
CreateServiceHost()
覆盖顶部的初始化。这种情况似乎只在每个服务中发生一次,而不是在每个服务调用中发生一次,但是对于多个服务来说,会有开销。通过使用静态标志或类似标志,这可能是一次性的。目前它似乎工作正常。

我发现了另一个关于使用的问题,它是通过
*.svc
文件设置的
*.svc
文件是WCF服务应用程序的一部分,不能由WCF服务库直接使用。我希望在实现服务和最终的生产托管时坚持使用服务库,以获得一定的灵活性,但使用WCF服务应用程序将以适合开发的方式完成工作(并且可能很容易访问IIS,使用一组备用配置进行生产托管)。所以我想我只需要创建一个WCF服务应用程序,作为服务库中服务的主机,并执行所需的初始化

我首先创建了一个新的WCF服务应用程序,删除了VS创建的默认服务文件,并添加了对现有服务库和其他依赖项的引用

在服务应用程序的
Web.Config
文件中,在
.
部分(必须是
标记后的第一个节点)下,我为服务库添加了
部分(可以从服务库中的
app.Config
文件中提取并根据需要进行编辑)

例如:

<system.serviceModel>
  <services>
    <service behaviorConfiguration="MyServiceBehavior" name="BelfryImages.QueryService.Implementation.HelloWorld">
      <endpoint address="HelloWorld" binding="wsHttpBinding" name="HelloWorld" contract="BelfryImages.QueryService.Contracts.IHelloWorld" />
    </service>
  </services>

  <behaviors>
    <serviceBehaviors>
      <behavior name="MyServiceBehavior">
        <serviceMetadata httpGetEnabled="true" />
        <serviceDebug includeExceptionDetailInFaults="true" />
      </behavior>
    </serviceBehaviors>
  </behaviors>

  <bindings>
  </bindings>
</system.serviceModel>
在第一次从
http://localhost:XXXXX/QueryService/HelloWorld
http://localhost:XXXXX/HelloWorld.svc/HelloWorld

然后,我创建了
ServiceHostFactory
,以对服务执行初始化。我发现一篇MSDN文章()解释了(清单5-6和5-7)-出于我的目的,我刚刚添加了一个更简单、通用的
CustomHostFactory
类:

public class CustomHostFactory
    : ServiceHostFactory
{
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {
        // perform initialisation:
        ...

        var serviceHost = base.CreateServiceHost(serviceType, baseAddresses);
        return serviceHost;
    }
}
然后,通过添加
工厂
属性,将其绑定到
.svc
文件中的服务:

<%@ ServiceHost Language="C#" Debug="true" Service="BelfryImages.QueryService.Implementation.HelloWorld" Factory="BelfryImages.WcfService.CustomHostFactory" %>


通常在创建服务之前,将执行
CreateServiceHost()
覆盖顶部的初始化。这种情况似乎只在每个服务中发生一次,而不是在每个服务调用中发生一次,但是对于多个服务来说,会有开销。通过使用静态标志或类似标志,这可能是一次性的。目前,它似乎工作正常。

这可能有效,但当库部署到另一台主机时,我无法停止静态构造函数的运行。这可能有效,但我无法停止静态构造函数