带有破折号的Asp.net Web Api查询字符串参数

Cat*_*lin 6 c# asp.net asp.net-web-api

我有一个Web.Api搜索方法,它接收以下参数:

[DataContract(Namespace = "", Name = "search")]
public class SearchParameters
{
    [DataMember(Name = "property-name")]
    public string PropertyName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Controller,我有这个动作:

[HttpGet]
public void Search([FromUri]SearchParameters request)
{
    var parameters = 1;
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试为PropertyNameproperty(property-name)创建一个友好名称,但模型绑定器无法识别参数:

/api/changeLog/search?propertyName=asd  // Works

/api/changeLog/search?property-name=asd // Doesn't work
Run Code Online (Sandbox Code Playgroud)

破折号是保留的查询字符串字符?或者我使用它错了?

Roy*_*tus 0

事实上,它是按照https://www.rfc-editor.org/rfc/rfc3986(RFC 3986 的标准页面,定义统一资源标识符,也称为 URI)中的定义保留的。

编辑我太快了——我在保留字符列表中将“=”误读为“-”。看来破折号确实与未保留的字符一起列出。这对我来说毫无意义,但这只是我的观点......这个 RFC 是官方标准,您会期望服务器尊重该格式 - IIS 可能会尊重这种格式,但 .NET 可能不会(见下文)。 编辑结束

通常查询字符串遵循 ITEM '&' ITEM... 格式,您可以将 ITEM 定义为 VARIABLE '=' VALUE。

但就像在编程语言中一样,VARIABLE 不能包含任何导致难以解析名称或将其映射到变量的字符。因此变量名中不能使用“*”、“-”等字符。

编辑对于 .NET,我希望这是因为 .NET 尝试将查询字符串参数名称映射到方法参数名称。但他们应该允许在属性中使用破折号[DataMember]。由于情况并非如此,我认为他们在构建此功能时没有查阅 RFC...有人愿意详细说明吗?编辑结束

相同信息的其他来源:

  • @RoyDictus:我似乎无法在 RFC 的保留分隔符列表中找到“-”。你确定它已经被预订了吗?事实上,它出现在第 13 页的“未保留”列表中。 (2认同)
  • 你是对的,我把“=”误读成了“-”。我认为使用这个字符仍然没有意义,但显然定义确实允许它。 (2认同)