ASP.NET MVC5/6 基于 Http Header 值的路由
ASP.NET MVC5/6 Routing based on Http Header values
假设我有一个最基本的控制器
public class HomeController : Controller
{
public ActionResult Index(string id, string language)
{
return View();
}
}
接受2个参数。但是,有一项要求是调用操作方法的客户端应该从 URL 传递 id
值,但从 http header 传递 language
值。这意味着 url 应该是 /Home/Index/12345
同时调用客户端将设置一个 Http Header 值 language : en
.
在MVC5或MVC6中如何设置路由才能达到要求?
请不要提供来自网络的示例 Api。
谢谢
有一个属性FromHeaderAttribute
。来自其文档:
Specifies that a parameter or property should be bound using the
request headers.
您应该可以将其添加到控制器的语言参数中。默认情况下,它会查找与参数同名的 header,但它还有一个 name
参数,可用于指定不同的名称,例如:
public ActionResult Index(string id, [FromHeader(Name="Accept-Language")]string language)
{
return View();
}
您还可以查看位于 github MVC repo 的测试站点 ModelBindingWebSite。检查名为 FromHeader_BlogController
.
的控制器
PS 查看 HeaderModelBinder
的源代码似乎可以用于绑定字符串和数组(假设 header 有一个逗号分隔的值列表)
如所述,您可以将控制器操作参数与FromHeaderAttribute
绑定。但请记住,控制器可以直接访问 Request.Headers
。离开控制器的语言参数并通过 属性:
访问作为枚举的值可能会更好
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;
}
}
}
假设我有一个最基本的控制器
public class HomeController : Controller
{
public ActionResult Index(string id, string language)
{
return View();
}
}
接受2个参数。但是,有一项要求是调用操作方法的客户端应该从 URL 传递 id
值,但从 http header 传递 language
值。这意味着 url 应该是 /Home/Index/12345
同时调用客户端将设置一个 Http Header 值 language : en
.
在MVC5或MVC6中如何设置路由才能达到要求?
请不要提供来自网络的示例 Api。
谢谢
有一个属性FromHeaderAttribute
。来自其文档:
Specifies that a parameter or property should be bound using the request headers.
您应该可以将其添加到控制器的语言参数中。默认情况下,它会查找与参数同名的 header,但它还有一个 name
参数,可用于指定不同的名称,例如:
public ActionResult Index(string id, [FromHeader(Name="Accept-Language")]string language)
{
return View();
}
您还可以查看位于 github MVC repo 的测试站点 ModelBindingWebSite。检查名为 FromHeader_BlogController
.
PS 查看 HeaderModelBinder
的源代码似乎可以用于绑定字符串和数组(假设 header 有一个逗号分隔的值列表)
如FromHeaderAttribute
绑定。但请记住,控制器可以直接访问 Request.Headers
。离开控制器的语言参数并通过 属性:
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;
}
}
}