C# Web API 2中的方法名称约定

C# Web API 2中的方法名称约定,c#,asp.net-web-api2,C#,Asp.net Web Api2,是否有Web API 2中使用的约定列表 以这两种方法为例。两者都可以工作,但都没有用属性装饰 IHttpActionResult GetMyModel(int id) IEnumerable<MyModel> GetAllMyModels() IHttpActionResult GetMyModel(int-id) IEnumerable GetAllMyModels() Get响应路由“{controller}/{action}/{id}”,因此我假设GetAllMyMod

是否有Web API 2中使用的约定列表

以这两种方法为例。两者都可以工作,但都没有用属性装饰

IHttpActionResult GetMyModel(int id)

IEnumerable<MyModel> GetAllMyModels()
IHttpActionResult GetMyModel(int-id)
IEnumerable GetAllMyModels()
Get
响应路由“{controller}/{action}/{id}”,因此我假设
GetAllMyModels
工作是因为它的返回类型?还是
GetAll
前缀

还有其他的惯例吗

另一方面,为什么
GetAllMyModels
返回可枚举项,而
GetMyModel
IHttpActionResult
中返回
MyModel
?我是否应该从
GetAllMyModels
返回
IHttpActionResult


谢谢

所以扩展它似乎只是返回某种元素集合的惯例。您可以愉快地返回单个元素,它只映射参数,在本例中为0

对于GetAllMyModels案例,我尝试了各种备选方案,它解决了以下问题

GetAllMyModels-是 GetMyModels-是 MyModels-否 是的

因此,答案似乎是,如果签名以Get开头,并且有一个返回IEnumerable*的签名,EntityType与其他控制器方法上使用的类型匹配,并且没有参数,那么它将用作返回所有实体的方法


*我的附带案例是,返回类型是可枚举的,而不是IHttpActionResult,这是一种速记。它相当于IHttpActionResult的返回类型,并返回Ok(值)

因此,扩展它似乎只是返回某种元素集合的约定。您可以愉快地返回单个元素,它只映射参数,在本例中为0

对于GetAllMyModels案例,我尝试了各种备选方案,它解决了以下问题

GetAllMyModels-是 GetMyModels-是 MyModels-否 是的

因此,答案似乎是,如果签名以Get开头,并且有一个返回IEnumerable*的签名,EntityType与其他控制器方法上使用的类型匹配,并且没有参数,那么它将用作返回所有实体的方法


*我的附带案例是,返回类型是可枚举的,而不是IHttpActionResult,这是一种速记。它相当于IHttpActionResult的返回类型,并返回Ok(值)

如果方法的名称以定义的HTTP方法开头,则在没有特定属性定义的情况下,它将映射到该方法

private static Collection<HttpMethod> GetSupportedHttpMethods()

//从方法名约定获取HttpMethod
对于(int i=0;i<_支持的httpmethodsbyconvention.Length;i++)
{
如果(methodInfo.Name.StartsWith)(
_supportedHttpMethodsByConvention[i]。方法,
StringComparison.Ordinalingorecase)
{
添加(_supportedHttpMethodsByConvention[i]);
打破
}
}
请注意,如果没有定义其他内容,则POST是默认的HTTP方法


您可以通过浏览来了解情况。

如果方法的名称以定义的HTTP方法开头,则在没有特定属性定义的情况下,它将映射到该方法

private static Collection<HttpMethod> GetSupportedHttpMethods()

//从方法名约定获取HttpMethod
对于(int i=0;i<_支持的httpmethodsbyconvention.Length;i++)
{
如果(methodInfo.Name.StartsWith)(
_supportedHttpMethodsByConvention[i]。方法,
StringComparison.Ordinalingorecase)
{
添加(_supportedHttpMethodsByConvention[i]);
打破
}
}
请注意,如果没有定义其他内容,则POST是默认的HTTP方法


您可以通过浏览来了解发生了什么。

我真的怀疑这在互联网上还没有很好的记录。到目前为止,您发现了什么?如果该方法的名称以
Get
开头,那么
Get
HTTP动词将使用它-根据需要传递给该方法的参数,它将选择最合适的一个,特别是在GetAll约定上。我很欣赏使用Get-here,但显然GetAll不是HTTP动词,所以我假设它在签名或方法名上匹配。Jim,我确信它在上千页上都有详细的描述,Google没有向我提供过任何一页。与其发表尖刻的评论,不如贡献一篇。我真的怀疑这在互联网上还没有很好的记录。到目前为止,您发现了什么?如果该方法的名称以
Get
开头,那么
Get
HTTP动词将使用它-根据需要传递给该方法的参数,它将选择最合适的一个,特别是在GetAll约定上。我很欣赏使用Get-here,但显然GetAll不是HTTP动词,所以我假设它在签名或方法名上匹配。Jim,我确信它在上千页上都有详细的描述,Google没有向我提供过任何一页。不如贡献其中一个,而不是发表尖刻的评论。谢谢,实际上我没有想到要查看代码。但我不确定我是否想从中寻找答案。我理解动词的关联,我一直在学习微软的一些教程,他们使用“约定”来获取所有元素,这些元素假设了很多。我只是想扩展我的答案以供参考,但我会接受你的答案。谢谢,实际上我没有想到要查看代码。但我不确定我是否想从中寻找答案。我理解动词的关联,我一直在学习微软的一些教程,他们使用“约定”来获取所有元素,这些元素假设了很多。我只是想扩大我的答案以供参考,但我接受你的答案。
// Get HttpMethod from method name convention 
for (int i = 0; i < _supportedHttpMethodsByConvention.Length; i++)
{
    if (methodInfo.Name.StartsWith(
        _supportedHttpMethodsByConvention[i].Method, 
        StringComparison.OrdinalIgnoreCase))
    {
        supportedHttpMethods.Add(_supportedHttpMethodsByConvention[i]);
        break;
    }
}