0

我正在开发一个博客站点,将其升级到 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 中是否有这样做的“重写”,而不是“路由”?我不想使用重定向。

4

1 回答 1

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"/>
于 2012-07-01T06:32:41.370 回答