C# 与WebApi重叠的路由

C# 与WebApi重叠的路由,c#,asp.net-web-api,C#,Asp.net Web Api,我正在尝试向默认WebApi示例添加特殊路由: 普通的是 /api/values(检索所有值) /api/values/{id}(检索特定值(通过数字id)) 现在我想添加以下api: /api/values/special 前面的api(/api/values/{id})应该为具有数字id的所有请求提供服务,但是/api/values/special应该为调用该特定url的请求提供服务 到目前为止,我得到了这个路由: config.Routes.MapHttpRoute("SpecialVal

我正在尝试向默认WebApi示例添加特殊路由:

普通的是

/api/values
(检索所有值)

/api/values/{id}
(检索特定值(通过数字id))

现在我想添加以下api:

/api/values/special

前面的api(
/api/values/{id}
)应该为具有数字id的所有请求提供服务,但是
/api/values/special
应该为调用该特定url的请求提供服务

到目前为止,我得到了这个路由:

config.Routes.MapHttpRoute("SpecialValues", "api/values/special", new { controller = "values", action = "SpecialValues"  });
config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);
这是为了实施:

public class ValuesController : ApiController
{
    // GET api/values
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/values/5
    public string Get(int id)
    {
        return "value";
    }

    // POST api/values
    public void Post([FromBody]string value)
    {
    }

    // PUT api/values/5
    public void Put(int id, [FromBody]string value)
    {
    }

    // DELETE api/values/5
    public void Delete(int id)
    {
    }

    // GET api/values/special
    public IEnumerable<string> SpecialValues()
    {
        return new string[] { "special1", "special2" };
    }
}
公共类值控制器:ApiController
{
//获取api/值
公共IEnumerable Get()
{
返回新字符串[]{“value1”,“value2”};
}
//获取api/values/5
公共字符串Get(int-id)
{
返回“值”;
}
//后api/值
公共作废帖子([FromBody]字符串值)
{
}
//将api/values/5放入
公共void Put(int id,[FromBody]字符串值)
{
}
//删除api/values/5
公共无效删除(int-id)
{
}
//获取api/值/特殊
公共IEnumerable特殊值()
{
返回新字符串[]{“special1”,“special2”};
}
}
但它将呈现:
请求的资源不支持http方法“GET”

如果我调用
/api/values/special
并将
[HttpGet]
添加到
SpecialValues
方法中,它将起作用
但是
/api/values
将停止工作,说明存在多个匹配操作。

不需要更改WebApiConfig。附加
Route
属性和
HttpGet
属性。你可以阅读更多关于它的内容


是的,如上所述,基于属性的路由是唯一的方法

这篇文章可能也会引起你的兴趣

这将导致以下消息:请求无效。参数字典包含“MVCAPApplication1.Controllers.ValuesController”中方法“System.String Get(Int32)”的不可为null类型“System.Int32”的参数“id”的null条目。可选参数必须是引用类型、可为null的类型或声明为可选参数。它仍然由Get方法获取。您的WebApiConfig类应该在我的答案中更新。另外,您正在调用的url应该类似-
http://hostname:port/api/values/special
非常有魅力,我错过了MapHttpAttributeRoutes的部分。谢谢这将导致错误:找到多个与请求匹配的操作:获取类型MVCAPApplication1.Controllers.ValuesController获取类型MVCAPApplication1.Controllers.ValuesController
[HttpGet]
[Route("api/{controller}/special")]
public IEnumerable<string> SpecialValues()
{
    return new string[] { "special1", "special2" };
}
public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Attribute routing.
        config.MapHttpAttributeRoutes();

        // Convention-based routing.
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}