ASP.NET MVC5/6基于Http报头值的路由

本文关键字:报头 路由 Http 基于 NET MVC5 ASP | 更新日期: 2023-09-27 18:03:17

假设我有一个最基本的控制器

public class HomeController : Controller
{
    public ActionResult Index(string id, string language)
    {
        return View();
    }
}

有2个参数。然而,有一个要求,客户端调用的动作方法应该从URL传递id值,但从http头传递language值。这意味着url应该是/Home/Index/12345,同时调用客户端将设置一个Http头值language : en

如何在MVC5或MVC6中设置路由以达到要求?

请不要提供Web Api的示例。

谢谢

ASP.NET MVC5/6基于Http报头值的路由

有一个属性FromHeaderAttribute。从它的文档:

指定参数或属性应使用请求头。

您应该能够将其添加到控制器的语言参数中。默认情况下,它将查找与参数名称相同的头,但它也有一个name参数,可用于指定不同的名称,例如:

public ActionResult Index(string id, [FromHeader(Name="Accept-Language")]string language)
{
    return View();
}

您还可以查看位于github MVC repo中的测试站点ModelBindingWebSite。查看控制器名称为FromHeader_BlogController

PS查看HeaderModelBinder的源代码,似乎这可以用于绑定字符串和数组(假设头部有一个逗号分隔的值列表)

正如Daniel J.G.所说,您可以将Controller动作参数与FromHeaderAttribute绑定。但请记住,控制器可以直接访问Request.Headers。省略Controller的语言参数并通过属性以枚举形式访问该值可能会更好:

  public enum LanguageType
  {
     Unknown = -1,
     English,
     Spanish,
     German,
     Chinese
  }
  public LanguageType Language
  {
     get
     {
        string langStr = Request.Headers["Accept-Language"];
        switch (langStr.ToLower())
        {
           case "english":
              return LanguageType.English;
           case "spanish":
              return LanguageType.Spanish;
           case "german":
              return LanguageType.German;
           case "chinese":
              return LanguageType.Chinese;
           default:
              return LanguageType.Unknown;
        }
     }
  }