我一直在寻找一种方法,只使用ASP.NET 3.5路由框架将http://www.example.com/WebService.asmx路由到http://www.example.com/service/,而无需配置IIS服务器。
到目前为止,我已经完成了大多数教程告诉我的内容,添加了对路由程序集的引用,在web.config中配置了东西,将其添加到 Global.asax :
protected void Application_Start(object sender, EventArgs e)
{
RouteCollection routes = RouteTable.Routes;
routes.Add(
"WebService",
new Route("service/{*Action}", new WebServiceRouteHandler())
);
}
...创建了这个类:
public class WebServiceRouteHandler : IRouteHandler
{
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
// What now?
}
}
......问题就在那里,我不知道该怎么做。我读过的教程和指南使用的是页面路由,而不是web服务。这甚至可能吗?
Ps :路由处理程序正在运行,我可以访问 / service / 并抛出中留下的 NotImplementedException GetHttpHandler 方法。
答案 0 :(得分:8)
我想我会根据Markives给出的答案提供更详细的解决方案来解决这个问题。
首先是路由处理程序类,它将虚拟目录作为构造函数参数传递给WebService。
public class WebServiceRouteHandler : IRouteHandler
{
private string _VirtualPath;
public WebServiceRouteHandler(string virtualPath)
{
_VirtualPath = virtualPath;
}
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
return new WebServiceHandlerFactory().GetHandler(HttpContext.Current,
"*",
_VirtualPath,
HttpContext.Current.Server.MapPath(_VirtualPath));
}
}
以及此类在Global.asax的路由位中的实际用法
routes.Add("SOAP",
new Route("soap", new WebServiceRouteHandler("~/Services/SoapQuery.asmx")));
答案 1 :(得分:2)
这适用于任何想要执行上述操作的人。我发现找到这些信息非常困难。
在GetHttpHandler(byVal requestContext as RequestContext) as IHttpHandler Implements IRouteHandler.GetHttpHandler
方法(我的上述版本)中
这是针对Webforms 3.5的方式(我在VB中)。
您无法使用通常的BuildManager.CreateInstanceFromVirtualPath()方法来调用您的Web服务,该服务仅适用于实现iHttpHandler的内容,而.asmx则不然。相反,你需要:
Return New WebServiceHandlerFactory().GetHandler(
HttpContext.Current, "*", "/VirtualPathTo/myWebService.asmx",
HttpContext.Current.Server.MapPath("/VirtualPathTo/MyWebService.aspx"))
MSDN文档说第3个参数应该是RawURL,传递HttpContext.Current.Request.RawURL不起作用,但是将虚拟路径传递给.asmx文件反而效果很好。
我使用此功能,以便无论如何配置的任何网站(甚至是虚拟目录)都可以调用我的web服务,该网站指向(在IIS中)我的应用程序可以使用“http://url/virtualdirectory/anythingelse/WebService之类的内容调用应用程序Web服务“并且路由将始终将此路由到我的.asmx文件。
答案 2 :(得分:1)
您需要返回一个实现IHttpHandler的对象,它会处理您的请求。
您可以查看有关如何使用该界面实现Web服务的文章:http://mikehadlow.blogspot.com/2007/03/writing-raw-web-service-using.html
但这可能更接近你想要的http://forums.asp.net/p/1013552/1357951.aspx(有一个链接,但需要注册,所以我没有测试)