我正在使用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 });
但这不是官方/记录的方式,并且可能会在将来的版本中发生变化,所以我的问题是,如果有任何方式来获得正确的HttpHandler
的asp .net WebService完全基于它的类型而不是它的虚拟路径?
答案 0 :(得分:1)
可以替代传统的asmx WebServices,使用WCF Web服务更加容易和可扩展。我终于找到了如何将WCF服务与IIS路由管道from here
集成的解决方案这是一个快速摘录:
RouteTable.Routes.Add(new ServiceRoute("CustomServiceAddress", new ServiceHostFactory(), typeof(WCFService)));