在研究了大量关于配置 WCF 设施的 Castle Windsor 帖子后,我编写了以下配置。
这将托管在 IIS 中。
我所做的假设是:
1) 我需要“.Hosted()”扩展名,因为我在 IIS 中托管它,“基地址”将由 Web 服务器解析。在其他应用程序中,我在自托管(Windows 服务或控制台应用程序等)时使用了“.AddBaseAddress(” http://etc “)”,但我的理解是在这种情况下不需要这样做。
2) 组件必须是“.Named(...)”,符合 .svc 标记的“服务”值。
3) “.At(...)” 将在 Web 服务器地址之外注册,因此不需要“ http://localhost:9278/ ”前缀。
设置如下:
来自 global.asax 文件的中央安装程序。
public static IWindsorContainer CreateContainer()
{
var container = new WindsorContainer();
container.AddFacility<WcfFacility>()
.Install(FromAssembly.This());
return container;
}
WCF 服务的特定安装程序类。
private const string FileServiceAddress = "Services/FileService.svc";
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container
.Register(Component.For<IFileService>()
.ImplementedBy<FileService>()
.Named("FileService")
.AsWcfService(new DataServiceModel()
.Hosted()
.PublishMetadata(o => o.EnableHttpGet())
.AddEndpoints(
WcfEndpoint
.BoundTo(new BasicHttpBinding())
.At(FileServiceAddress))));
}
和 .svc 标记
<%@ ServiceHost
Language="C#"
Debug="true"
Service="FileService"
CodeBehind="FileService.svc.cs"
Factory="Castle.Facilities.WcfIntegration.DefaultServiceHostFactory,
Castle.Facilities.WcfIntegration" %>
但是,当我尝试调试/运行此解决方案时,它不会解析端点。如果我取出 .Hosted() 并为我安装的每个服务替换为 .AddBaseAddress(...) 那么它似乎工作正常?!但这肯定是错误的行为吗?和重复的基地址?当然,当我在处理基地址和端口绑定的 IIS 中部署它时,它不会正确注册?
我错过了什么?针对设施注册 WCF 服务的正确方法是什么?
非常感谢帮助!
更新:调整后这个工作,但为什么呢?我没有指定任何配置,但端点可用?
container
.Register(Component.For<IFileService>()
.ImplementedBy<FileService>()
.Named("FileService")
.LifeStyle.PerWcfOperation());