- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我创建了一个 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/
我是一名优秀的程序员,十分优秀!