使用MVC3,如何根据“accept”标题更改控制器/操作?

时间:2012-04-10 21:17:28

标签: asp.net-mvc rest http-headers

我有一个应用程序,它可以充当来自各种目标的请求的“全能”。我希望能够根据“accept”标头的值重定向到我的应用程序中的不同控制器/操作。

澄清:如果可能的话,我想在没有HTTP处理程序的情况下这样做。

3 个答案:

答案 0 :(得分:4)

您可以编写自定义路线:

public class MyRoute : Route
{
    public MyRoute(string url, object defaults)
        : base(url, new RouteValueDictionary(defaults), new MvcRouteHandler())
    {

    }

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        var rd = base.GetRouteData(httpContext);
        if (rd == null)
        {
            return null;
        }

        var accept = httpContext.Request.Headers["Accept"];
        if (string.Equals("xml", accept, StringComparison.OrdinalIgnoreCase))
        {
            rd.Values["action"] = "xml";
        }
        else if (string.Equals("json", accept, StringComparison.OrdinalIgnoreCase))
        {
            rd.Values["action"] = "json";
        }
        return rd;
    }
}

然后注册这条路线:

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

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

现在,当您向/home发帖并将Accept请求标头设置为xml时,Xml控制器的Home操作将会被点击。

答案 1 :(得分:0)

制作一个路线..只是一个简单的类,并从RouteBase派生出来,你会发现返回类型为GetRouteData(System.Web.HttpContextBase httpContext)的方法RouteData 你可以从httpcontext挑选你选择的标题,并将你的路线值添加到函数的返回值中。

答案 2 :(得分:0)

你可以使用它拥有Route Magic的Phil haack HttpHandler Routing插件但是它使用HttpHandler你可以看看,看看你是否喜欢它

Route Magic