[英]How can I perform initialisation in a WCF service library that isn't self-hosted?
我已经创建了一个WCF服务库,其中包含一个简单的“hello world”测试服务和一个正确配置的App.config文件,因此当我启动客户端应用程序时,WCF服务是通过Visual Studio的内置主机启动的。 现在的服务与我的客户端中的外部配置一起正常工作。
我需要运行一些初始化代码来设置DI,数据访问,日志记录等。我已经编写了一个可以做到这一点的控制台主机,并且服务本身最终将部署为Windows服务,但我想使用内置的-in host,这样我就不必在开发过程中手动重启服务。
有没有什么方法可以挂钩库中的一些代码,以便在启动时调用?
我发现了另一个关于使用自定义ServiceHostFactory
执行引导的问题 ,该引导是通过*.svc
文件设置的。 *.svc
文件是WCF服务应用程序的一部分,不能由WCF服务库直接使用。 我想坚持使用服务库来实现服务和最终生产托管的一些灵活性,但是使用WCF服务应用程序将以适合开发的方式完成工作(并且可能很容易丢弃使用备用配置集进入IIS进行生产托管)。 所以我想我只需要创建一个WCF服务应用程序,它充当服务库中服务的主机,并执行所需的初始化。
我首先创建了一个新的WCF服务应用程序,删除了VS创建的默认服务文件,并添加了对现有服务库和其他依赖项的引用。
在服务应用程序的Web.Config
文件中,在<configSections>..</configSections>
部分(需要是<configuration>
标记之后的第一个节点)下,我为服务添加了<system.serviceModel>
部分。库(可以从服务库中的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>
请注意, BelfryImages.QueryService.Implementation.HelloWorld
是服务契约(接口) BelfryImages.QueryService.Contracts.IHelloWorld
的服务实现(实现类)的BelfryImages.QueryService.Contracts.IHelloWorld
。 我实际上有两个单独的组件; BelfryImages.QueryService.Contracts.dll
是WCF服务库。
我向服务应用程序添加了一个新的空白.svc
文件,命名为匹配端点,例如HelloWorld.svc
。 通常,将WCF服务添加到WCF服务应用程序会生成.svc
文件和.cs
隐藏文件,其中包含服务的实现。 我手动添加了没有代码隐藏的.svc
文件,并将其指向服务库实现:
<%@ ServiceHost Language="C#" Debug="true" Service="BelfryImages.QueryService.Implementation.HelloWorld" %>
在第一次将客户端的服务URL从http://localhost:XXXXX/QueryService/HelloWorld
更改为http://localhost:XXXXX/HelloWorld.svc/HelloWorld
之后,这可用作VS托管服务库的替代品http://localhost:XXXXX/HelloWorld.svc/HelloWorld
。
然后,我创建了ServiceHostFactory
来执行服务的初始化。 我找到了一篇MSDN文章( 托管和使用WCF服务 ),解释了如何执行此操作 (清单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;
}
}
然后通过添加Factory
属性将其绑定到.svc
文件中的服务:
<%@ ServiceHost Language="C#" Debug="true" Service="BelfryImages.QueryService.Implementation.HelloWorld" Factory="BelfryImages.WcfService.CustomHostFactory" %>
CreateServiceHost()
覆盖顶部的初始化是在照常创建服务之前执行的。 这似乎只发生在每个服务一次,而不是每次调用一次服务,但是会有多个服务的开销。 这可能是通过使用静态标志或类似的一次性。 目前似乎工作正常。
是否可以在实现服务的类的静态构造函数中使用初始化代码?
public class WCFService : IWCFService
{
static WCFService()
{
// do initializing here
}
}
此代码将在对服务进行第一次调用时执行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.