【发布时间】:2012-12-09 20:13:18
【问题描述】:
我正在使用 asp.net RouteTable 为 WebService 注册自定义路由,但是 asp.net WebServices 不继承自 IHttpHandler 接口,这使得将调用传递给底层既不简单也不干净HttpHandler.
目前,唯一的官方/记录方式是使用WebServiceHandlerFactory 为服务获取正确的处理程序:
IHttpHandler handler = new WebServiceHandlerFactory().GetHandler(HttpContext.Current, "*", "url", "path");
但是,这需要服务的虚拟路径,这不是我想要的!我发现的另一种解决方法实际上是使用反射侵入WebServiceHandlerFactory 并调用内部CoreGetHandler 方法:
var wshf = new WebServiceHandlerFactory();
var coreGetHandler = wshf.GetType().GetMethod("CoreGetHandler", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
var httpHandler = (IHttpHandler)coreGetHandler.Invoke(wshf, new object[] { typeof(MyWebService), context, context.Request, context.Response });
但这不是官方/记录的方式,并且可能会在未来的版本中改变,所以我的问题是,如果有 any 方法来获得正确的HttpHandler asp.net WebService 仅仅基于它的类型而不是它的虚拟路径?
【问题讨论】:
-
您可能没有意识到这一点,但 ASMX Web 服务是一项遗留技术。将来不会有任何版本。为什么不使用已经支持路由的 WCF?
-
谢谢 John,你的意思是我可以在 IIS 路由管道中定义 WCF 路由吗?或者我必须使用 WCF bindigs 定义路由?我一直在使用 WCF REST Web 服务,但我记得,它需要我创建自己的
ServiceHost/WebServiceHost和绑定,而我宁愿依赖 IIS 绑定 -
除了使用 WCF WebServiceHost(Silverlight 的服务)的标准路由外,我什么都没做过。我的观点很简单,WCF 的可扩展性和可配置性大约是 ASMX 的 100 倍,因此真的没有理由坚持使用已被 WCF 取代的旧技术。
标签: c# asp.net web-services asmx