gpt4 book ai didi

c# - 如何在非自托管的 WCF 服务库中执行初始化?

转载 作者:太空宇宙 更新时间:2023-11-03 22:13:48 24 4
gpt4 key购买 nike

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

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

有什么方法可以 Hook 库中的一些代码以在启动时调用?

最佳答案

我发现了另一个关于使用 custom ServiceHostFactory to perform bootstrapping 的问题, 这是通过 *.svc 设置的文件。 *.svc文件是 WCF 服务应用程序的一部分,不能由 WCF 服务直接使用。我想坚持使用服务库来实现服务的一些灵 active 和最终的生产托管,但是使用 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是服务契约(接口(interface))的服务实现(实现类)的FQN 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 更改之后,这可用作 VS 托管服务库的直接替代品。至 http://localhost:XXXXX/HelloWorld.svc/HelloWorld .

然后我创建了 ServiceHostFactory执行服务的初始化。我找到了一篇解释 Hosting and Consuming WCF Services 的 MSDN 文章 ( how to do this) ( list 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;
}
}

然后将其绑定(bind)到 .svc 中的服务通过添加 Factory 文件属性:

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

CreateServiceHost() 顶部的初始化override 在服务创建之前执行。这似乎每个服务只发生一次,而不是每次调用服务一次,但是多个服务会有开销。这可能会通过使用静态标志或类似的方式一次性完成。目前它似乎工作正常。

关于c# - 如何在非自托管的 WCF 服务库中执行初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5724539/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com