【问题标题】:ASP.NET WebApi Routes and parameters typesASP.NET WebApi 路由和参数类型
【发布时间】:2015-11-13 18:22:18
【问题描述】:

我已经阅读了很多文章和类似的问题,但没有一个决定不适合我。 我有 3 种方法:

public string GetA()
{
   return "Hello from GetA";
}
public string GetB(int id)
{
   return "Hello from GetB";
}
public string GetC(sting all)
{
   return "Hello from GetC";
}

我需要像这样配置路由:

1.http://localhost:63087/api/Test/
2.http://localhost:63087/api/Test/all
3.http://localhost:63087/api/Test/1
4.http://localhost:63087/api/Test/1/all

我该如何实现它?
我知道这可能是重复的(123),但我需要帮助。

提前谢谢你

【问题讨论】:

  • @CliffBurton 你读过这个问题吗?我知道并写道“我知道这可能是重复的 (1, 2, 3),但我需要帮助。”并且有一个链接。链接号 3 相同。请阅读问题

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


【解决方案1】:

其他解决方案是在路由中添加静态段:

1.http://localhost:63087/api/Test/
2.http://localhost:63087/api/all/Test/
3.http://localhost:63087/api/Test/1
4.http://localhost:63087/api/all/Test/1

实施:

    public string GetA()
    {
        return "Hello from GetA";
    }
    public string GetB(int id)
    {
        return "Hello from GetB";
    }

    [Route("api/all/{controller}/{id}")]
    [Route("api/all/{controller}")]
    public string GetC(int id= 0)
    {
        return "Hello from GetC";
    }

路线配置:

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

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

【讨论】:

  • 我喜欢这个解决方案。一个它的工作。谢谢。谢谢。谢谢
  • 但是现在我遇到了另一个继承问题。因为 Route 属性没有被继承。你能帮帮我吗?
  • 你在哪里使用继承?
【解决方案2】:

所以,你不能有两个具有相同参数计数的路由。

2.http://localhost:63087/api/Test/all
3.http://localhost:63087/api/Test/1

这样,您可以在所有方法中使用参数类型string

public string GetA()
{
   return "Hello from GetA";
}
public string GetB(string id, string all = "")
{
   if (id.Equals("all") || all.Equals("all"))
   {
       return "Hello all from GetB";
   }
   return string.Format("Hello {0} from GetB", id);
}

路线配置:

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

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

【讨论】:

  • 谢谢。我认为对 ID 值使用字符串类型是不合适的
  • 好的。这只是可能的解决方案之一
【解决方案3】:

像这样配置你的路线

http://localhost:63087/api/Test
http://localhost:63087/api/Test/1
http://localhost:63087/api/Test/1/all

类似这样的:

config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/Test",
                defaults: new { controller = "Test", action = "GetA"}
            );

            config.Routes.MapHttpRoute(
                name: "Route2",
                routeTemplate: "api/Test/{id}",
                defaults: new { controller = "Test", action = "GetB" }
            );

            config.Routes.MapHttpRoute(
                name: "Route3",
                routeTemplate: "api/Test/{id)/{all}",
                defaults: new { controller = "Test", action = "GetC"}
            );

【讨论】:

  • 不,这不是我的路线。请看问题。我有 4 条路线
  • 您不能有两个具有相同参数计数的路由。如果您有事件,那么路由引擎将只考虑第一条路由。所以,2和3不能同时实现。
  • 是的,你是对的。这就是我创造问题的原因。我需要解决这个问题
  • 尝试用相同的路由实现2和4的功能。对于http://localhost:63087/api/Test/all,请尝试对 id 使用一些默认值(例如 0 或 -1),这意味着所有 id。现在您的第二条路线变为http://localhost:63087/api/Test/0/{all},第四条路线变为http://localhost:63087/api/Test/{id}/{all}
  • 谢谢,这个解决方案有效。你还能提供什么其他的方法给我?因为0不是很好
【解决方案4】:

试试这个代码:

    public static class WebApiConfig
    {
       public static void Register(HttpConfiguration config)
       {           
                config.SuppressDefaultHostAuthentication();
                config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

                // Web API routes
                config.MapHttpAttributeRoutes();

                config.Routes.MapHttpRoute(
                    name: "DefaultApi",
                    routeTemplate: "api/Test",
                    defaults: new { controller = "Test", action = "GetA"}
                );

                config.Routes.MapHttpRoute(
                    name: "WithID",
                    routeTemplate: "api/Test/{id}",
                    defaults: new { controller = "Test", action = "GetB", id = UrlParameter.Optional }
                );

                config.Routes.MapHttpRoute(
                    name: "ALL",
                    routeTemplate: "api/Test/all",
                    defaults: new { controller = "Test", action = "GetC"}
                );
            }
    }

【讨论】:

  • 谢谢,但这对我没有帮助。 http://localhost:58052/api/test - 好的,http://localhost:58052/api/test/all - 参数字典包含不可空类型“System.Int32”的参数“id”的空条目...,http://localhost:58052/api/test/1 - 好的,http://localhost:58052/api/test/1/all - HTTP 404.0 - 不是找到
猜你喜欢
  • 1970-01-01
  • 2019-02-02
  • 1970-01-01
  • 2016-05-12
  • 1970-01-01
  • 2017-08-05
  • 2013-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多