如何映射ASP.NET MVC3中实际不存在的axd

时间:2012-06-30 23:07:03

标签: asp.net-mvc url-rewriting url-routing asp.net-mvc-routing

我正在博客网站上工作,将其升级到MVC3。

我在web.config中有这个:

<add name="RssHandler" verb="*" path="rss.axd" type="Blog.Web.RSSHandler, Blog.Web"/>

因此,如果我直接从url访问rss.axd,它可以工作:

http://mydomain/rss.axd

现在我想使用http://mydomain/RSS来映射rss.axd,所以在global.asax中,我试过了

public static void RegisterRoutes(RouteCollection routes)
{
    routes.MapPageRoute("RSS-View", "RSS", "~/rss.axd", false);
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    ...
}

但是我收到了404错误,因为rss.axd不是网站文件夹中存在的物理文件。

过去,我使用UrlRewrite执行此操作,它的工作方式如下:

<LookFor>~/RSS<LookFor>
<SendTo>~/rss.axd</SendTo>

那么,在MVC3中是否还有“ReWrite”,而不是“Route”?我不想使用重定向。

1 个答案:

答案 0 :(得分:1)

没有可用于路由到http处理程序的内置支持。

一种可能性是编写一个自定义路由处理程序(IRouteHandler),它将返回RSSHandler的实例:

public class RssRouteHandler : IRouteHandler
{
    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        return new Blog.Web.RSSHandler();
    }
}

最后你可以注册这条路线:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.Add("RSS-View", new Route("rss", new RssRouteHandler()));

    routes.MapRoute(
        "Default",
        "{controller}/{action}/{id}",
        new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

现在我们不再浏览虚拟rss.axd地址了。当向/rss发出请求时,我们通过自定义路由处理程序直接提供此请求,就像我们在web.config中有以下内容一样:

<add name="RssHandler" verb="*" path="rss" type="Blog.Web.RSSHandler, Blog.Web"/>