城堡WCF设施 |视窗服务托管
本文关键字:服务 WCF 设施 城堡 | 更新日期: 2023-09-27 18:35:44
我正在尝试在我的WCF项目中使用Castle WCF集成工具,但迷路了。你能帮帮我吗?
所以,情况是这样的:
我有一个WCF服务库,它托管在通过TCP的Windows服务中。以下是我的 WCF 服务库中的内容:服务范围:
[ServiceContract]
public interface ICalculatorService
{
[OperationContract]
int Add(int x, int y);
}
public class CalculatorService : ICalculatorService
{
public int Add(int x, int y)
{
return x + y;
}
}
配置:
<system.serviceModel>
<services>
<service name="namespace.CalculatorService">
<endpoint address="" binding="netTcpBinding" bindingConfiguration=""
contract="namespace.iCalculatorService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexTcpBinding" bindingConfiguration=""
contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8732/CalculatorService/" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="false" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
容器配置 这是在 WCF 项目中,我将所有内容注册到 castle(我不确定应该在哪里注册 wcf 设施,是应该从 WCF 服务还是从托管 WCF 服务的 Windows 服务注册)。
public class ConfigureContainerCastle
{
private readonly IWindsorContainer container;
public ConfigureContainerCastle(IWindsorContainer container)
{
this.container = container;
}
public void Configure()
{
// Any component registration.
container.Register(Component.For<ICalculatorService>().ImplementedBy<CalculatorService>());
//All other component registration.
}
}
以下是我的 Windows 服务中的内容:
public class Host<T>:ServiceBase
{
private ServiceHost serviceHost = null;
protected override void OnStart(string[] args)
{
if (serviceHost != null)
{
serviceHost.Close();
}
// How do I call the DefaultServiceHostFactory and start the service?
// Should I call the WCF facility from here or from WCF service library?
// var container = new WindsorContainer();
// var configureContainer = new DataServicesConfigureContainer(container);
// var hostFactory = new DefaultServiceHostFactory(container.Kernel);
serviceHost = new ServiceHost(typeof (T));
serviceHost.Open();
}
protected override void OnStop()
{
if (serviceHost == null)
return;
serviceHost.Close();
serviceHost = null;
}
}
我的Windows服务配置(app.config)与我的WCF服务相同,字面意思是逐行。
现在的问题是,如何将这一切与 WCF 设施连接在一起?我见过很多使用 http 和 global.asax 的例子,但没有一个用于 Windows 服务的例子。你能帮忙吗?即使是指向它的适当链接也会有所帮助。
谢谢-话筒
首先是一点 - 如果你想要TCP,你需要使用net.tcp
协议指定基址,如下所示:
<add baseAddress="net.tcp://localhost:8732/CalculatorService" />
但这不是你的问题,所以压倒...
(我不确定应该在哪里注册 wcf 工具,是应该从 WCF 服务注册还是从承载 WCF 服务的 Windows 服务注册)。
我建议您在靠近注册服务的地方注册设施。 因此,在 WCF 服务库中 - 实际上,您发布的代码位将是注册它的好地方(只要它已注册,我认为它在哪里没有太大区别)。
现在的问题是,如何将这一切与 WCF 设施连接在一起?我见过很多使用 http 和 global.asax 的例子,但没有一个用于 Windows 服务的例子。你能帮忙吗?即使是指向它的适当链接也会有所帮助。
实际上很简单 - 如果你想将你的配置保留在你的配置文件中,你可以像这样更改你的Configure
方法(我假设你已经有对Castle.Facilities.WcfIntegration
的引用):
public void Configure()
{
container.AddFacility<WcfFacility>();
// Any component registration.
container.Register(Component
.For<ICalculatorService>()
.ImplementedBy<CalculatorService>()
.AsWcfService());
//All other component registration.
}
就是这样 - 当 WCF 客户端连接到它时,Windsor 现在负责提供服务(不要相信我 - 在您的 CalculatorService 中添加一些依赖项并惊叹于奇迹)。
您可能想考虑现在完全取消配置文件并使用 Windsor fluent API - 它非常直观,只需看看您可以传递到 AsWcfService 方法中的内容即可(或者只是坚持使用配置文件)。