【问题标题】:FromHeader attribute with multiple names具有多个名称的 FromHeader 属性
【发布时间】:2021-08-13 11:43:17
【问题描述】:

我想将具有多个名称的 FromHeader 属性(例如用于多语言支持)用于同一模型。

public async Task<IActionResult> Create([FromHeader(Name="Test-NLD"),FromHeader(Name="Test-ENG")] string Test)

您不能对同一模型使用多个具有另一个名称的 FromHeader 属性(错误 CS0579,重复“FromHeader”属性)。

解决此问题的最佳方法是什么?我使用 Swagger,所以如果 Swagger 文档仍然正确,那就太好了。

【问题讨论】:

  • 您是否需要保留该格式的标题键,或者您可以为语言选择制作一个标题,为值制作另一个标题?
  • 如果可能的话,我想保留标题键的格式。
  • 你有一个小的固定语言列表吗?
  • 目前支持的语言只有 NL-nl 和 EN-us。

标签: c# .net .net-core


【解决方案1】:

在短期内,您需要为您的操作设置两个不同的参数,一个绑定到每个可能的 Header 键。

public async Task<IActionResult> Create(
    [FromHeader(Name="Test-NLD")] string testNld,
    [FromHeader(Name="Test-ENG")] string testEng)

FromHeader 不接受单个参数或通配符的多个条目。

目前,如果您只打算支持 2 种语言,您可能可以通过此解决方案勉强应付。可以理解,这是非常需要维护的,也是“技术债务”的定义。


当标题键是静态的时,ASP.Net 和 Swagger 都可以发挥最佳作用。无法记录“您需要提供名为 Test-* 的标头,其中 * 是 'NLD' 或 'ENG'。”

以后,我还是非常推荐你把语言的选择拆分成自己的key。您甚至可以使用“标准”Accept-Language 标头。

public async Task<IActionResult> Create(
    [FromHeader(Name="Accept-Language")] string clientLanguages,
    [FromHeader(Name="Test")] string test)

Accept-Languages 的编写是为了让客户按优先顺序为您提供他们想要的语言的 CSV。您选择您支持的第一个,并使用 Content-Language 响应标头通知客户端选择。

还有更优雅的方法来获取 Accept-Language 标头,请参阅this post

【讨论】:

    猜你喜欢
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多