WebAPI - routes

时间:2015-05-08 10:01:07

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

I am new into WebAPI and I don't understand how routing in WebAPI v2 works.

I've created simple test controller:

setReadLimit

I would like to reach each method by:

<a href="index.php">Back</a>

and I don't know how to achieve it. I changed routes in WebApiConfig.cs to:

public class TestController : ApiController
{
    public List<string> GetAll()
    {
        return new List<string>();
    }

    public string Get(int id)
    {
        return string.Empty;
    }

    public string GetSmthByParam1(int param)
    {
        return string.Empty;
    }

    public string GetSmthByParam2(int param)
    {
        return string.Empty;
    }

    public List<string> GetAllByParam(int param)
    {
        return new List<string>();
    }
}

8 个答案:

答案 0 :(得分:3)

  1. 安装Nuget-Package AttributeRouting.WebAPI

  2. 请勿在WebApiConfig

  3. 中触摸默认路线
  4. 添加&#34; config.MapHttpAttributeRoutes();&#34;进入WebApiConfig类的Register方法,所以它将是:

    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API routes
            config.MapHttpAttributeRoutes();
    
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
            ...
        }
    }
    
  5. 现在您可以将RouteAttrubute添加到任何类似的webapi操作:

    [HttpGet]
    [AllowAnonymous]
    [Route("api/test/get/{id}")]
    public string Get(int id)
    {
        return string.Empty;
    }
    
  6. 这些链接非常有用:first&amp; second

答案 1 :(得分:0)

答案 2 :(得分:0)

所以使用属性路由很好,但我建议现在不要这样做,因为它封装了你现在必须学习的很多逻辑。另外,我不认为属性路线每次都是好的做法。有些时候,当你构建非常庞大的应用程序时,来自config的路由是更好的选择。 现在看你路由配置 你的参数是“id”所以当路由命中它时会提取你的参数,它会将它注入你的方法。在你的最后3种方法中,你使用了“param”作为你的方法参数,这是路由无法注入的东西。作为名称don; t匹配路由参数和方法参数。 更进一步,如果你将创建一个类似于前一个的路由并将route参数更改为“param”,它仍然不起作用,因为路由映射的工作原理是先到先得。我希望你在这方面没什么开始,你就会明白学习路由基础知识和使用属性的重要性。

答案 3 :(得分:0)

虽然我知道这是你提出的一个基本例子,但我对你的实际商业案例感兴趣了。为什么你的控制器有很多GETS?这没有什么不妥,请记住,我只是好奇。通常情况下,我已经能够避免使用ODATA查询,策略模式或能够检索所需内容的服务等概念进行多次获取。正如其他人所提到的那样,路由属性是一个很好的解决方案,但正如其他人提到的那样,它可能是一个问题,你必须开始在控制器上使用路由前缀和路由属性,以便有时使路由更清晰,它可以快速变得有点凌乱(我的团队有时会在他们没有正确遵循惯例并且他们的控制器路线不直观的情况下这样做)

最后,你将拥有哪些返回类型 - 它们真的都是字符串吗?

谢谢!

答案 4 :(得分:0)

非常简短,webapi将用于签名,而不仅仅是mvc路由工作的动作名称, 所以要解决这个困境就是

1)MVC5带有属性路由,因此可以在动作或控制器级别定义它以使其更容易

2)使用正常路由的reqeust类型使你的签名对彼此独特,但如果你的路由有相同的签名,那么做这样的事情

像这样定义您的路由,

 config.Routes.MapHttpRoute(
           name: "Defaultapi",
           routeTemplate: "api/{controller}/{action}/{id}",
           defaults: new { id = RouteParameter.Optional }
       );

答案 5 :(得分:0)

WebAPI中的默认路由机制尝试播放CRUD态度。 这就是这个......

当它符合您的需求时 - 去吧。 通常,更好的方法是属性

  • [RoutePrefix( “测试”)]
  • 〔路线( “获取”)]

(就像拉克什写的那样)。

它以更好的方式安排您的控制器,并且更容易期望URL ..

答案 6 :(得分:0)

您不需要使用属性路由。只需在方法中添加一个http动词属性,并在一些方法中将'param'更改为'id'。

public class TestController : ApiController
{
    [HttpGet]
    public List<string> GetAll()
    {
        return new List<string>();
    }

    [HttpGet]
    public string Get(int id)
    {
        return string.Empty;
    }

    [HttpGet]
    public string GetSmthByParam1(int id)
    {
        return string.Empty;
    }

    [HttpGet]
    public string GetSmthByParam2(int id)
    {
        return string.Empty;
    }

    [HttpGet]
    public List<string> GetAllByParam(int id)
    {
        return new List<string>();
    }
}

https://docs.microsoft.com/en-us/aspnet/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

答案 7 :(得分:0)

属性路由是您应该寻找的东西。它以更好的方式简化了你的Api,你永远不必猜测在ApiConfig中查看你的路线图哪条路线得到解决。有关是否应该选择属性路由的讨论,但在我看来,这实际上取决于您希望API的简单性和可读性。快乐的编码。