是否可以在没有配置或svc文件的情况下使用castle windsor fluent配置来配置WCF服务
本文关键字:配置 castle windsor fluent 服务 WCF 情况下 文件 是否 svc | 更新日期: 2023-09-27 18:19:57
我有一个托管在IIS上的ASP.Net MVC 3.0 web应用程序,我使用的是Castle Windsor 3.0版本。
我想做的是使用webHttpBinding注册WCF服务,在web.config中没有任何条目或有.svc文件。这可能吗?
我在IWindsorInstaller实现中尝试过这个:
container.AddFacility<WcfFacility>(f => f.CloseTimeout = TimeSpan.Zero);
container.Register(
Component
.For<IMyService>()
.ImplementedBy<MyService>()
.AsWcfService(new DefaultServiceModel()
.AddBaseAddresses("http://localhost/WebApp/Services")
.AddEndpoints(WcfEndpoint
.BoundTo(new WebHttpBinding())
.At("MyService.serv"))
.Hosted()
.PublishMetadata()));
我忽略了在全局asax:中的RegisterRoutes方法中完成服务的任何内容
routes.IgnoreRoute("{resource}.serv/{*pathInfo}");
如果我将浏览器指向http://localhost/WebApp/Services/MyService.serv我得了404分。
我做错了什么,或者我试图做一些愚蠢的事情(或者不可能,或者两者都有!)?
感谢Ladislav关于使用ServiceRoute的建议,我已经想出了如何做到这一点,但我不确定它是否理想,以下是我所做的(以防谷歌发现并改进它等):
在ComponentRegistration上创建了一个类似的扩展方法:
public static ComponentRegistration<T> AddServiceRoute<T>(
this ComponentRegistration<T> registration,
string routePrefix,
ServiceHostFactoryBase serviceHostFactory,
string routeName) where T : class
{
var route = new ServiceRoute("Services/" + routePrefix + ".svc",
serviceHostFactory,
registration
.Implementation
.GetInterfaces()
.Single());
RouteTable.Routes.Add(routeName, route);
return registration;
}
这样做的目的是添加一个服务路由,将服务放在Services文件夹下,并附加到.svc扩展名上(我可能会删除它)。注意,我假设该服务只实现一个接口,但在我的情况下,这很好,我认为这是一个很好的实践。
我不确定这是拥有这种扩展方法的最佳位置,或者即使真的需要扩展方法——也许我应该用服务主机构建器或其他什么东西来做,我不知道!
然后,在MapRoute调用中,我确保根据问题MVC2 Routing with WCF ServiceRoute:Html.ActionLink渲染不正确的链接,将其添加到constraints参数中!
new { controller = @"^(?!Services).*" }
这只会使启动服务的任何内容都无法作为控制器进行匹配。我不太喜欢这个,因为我必须将它添加到我的所有路由中——我宁愿全局地将Services文件夹放入服务解析器或其他什么中(我似乎对MVC了解不够!)。
最后,在我的windsor安装程序中,我注册了这样的服务:
container.AddFacility<WcfFacility>(
f =>
{
f.Services.AspNetCompatibility =
AspNetCompatibilityRequirementsMode.Allowed;
f.CloseTimeout = TimeSpan.Zero;
});
container.Register(
Component
.For<IMyService>()
.ImplementedBy<MyService>()
.AsWcfService(new DefaultServiceModel()
.AddEndpoints(WcfEndpoint.BoundTo(new WebHttpBinding()))
.Hosted()
.PublishMetadata())
.AddServiceRoute("MyService", new DefaultServiceHostFactory(), null));
之后,我可以浏览到该服务,它被提取并构建得很好!
正如我所暗示的,这可能不是最好的方法,但它是有效的。