【问题标题】:Overlapping routes with WebApi使用 WebApi 重叠路由
【发布时间】:2014-03-02 00:12:01
【问题描述】:

我正在尝试向默认 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" };
    }
}

但它会呈现:The requested resource does not support http method 'GET'

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

【问题讨论】:

    标签: c# asp.net-web-api


    【解决方案1】:

    不需要对 WebApiConfig 进行更改。附加一个Route 属性和一个HttpGet 属性。你可以阅读更多关于它的信息here

    [HttpGet]
    [Route("api/{controller}/special")]
    public IEnumerable<string> SpecialValues()
    {
        return new string[] { "special1", "special2" };
    }
    

    WebApiConfig -

    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 }
            );
        }
    }
    

    【讨论】:

    • 这将导致以下消息:请求无效。 参数字典包含不可为空类型的参数“id”的空条目“MvcApplication1.Controllers.ValuesController”中方法“System.String Get(Int32)”的“System.Int32”。可选参数必须是引用类型、可空类型或声明为可选参数。 还是被Get方法捡到的
    • 您的 WebApiConfig 类应该在我的回答中更新。您调用的网址也应该是 - http://hostname:port/api/values/special
    • 工作就像一个魅力,我错过了 MapHttpAttributeRoutes 的部分。谢谢!
    【解决方案2】:

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

    您可能也会对这篇文章感兴趣 Overload web api action method based on parameter type

    【讨论】:

    • 这会导致错误:找到与请求匹配的多个操作:获取类型 MvcApplication1.Controllers.ValuesController 获取类型 MvcApplication1.Controllers.ValuesController
    猜你喜欢
    • 2014-03-01
    • 2014-09-26
    • 1970-01-01
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    相关资源
    最近更新 更多