代码之家  ›  专栏  ›  技术社区  ›  Kgn-web

在使用属性路由的Web Api中找到多个与请求匹配的操作

  •  1
  • Kgn-web  · 技术社区  · 6 年前

    出于好奇,我试图用重载的数量构建API。

    最初,我得到以下错误

    - Multiple actions were found that match the request in Web Api

    不过,我还是想用另一种方式尝试一下,而不是上面提到的链接。

    我继续&用 [Route]

    namespace CTB_APP.Controllers.API.Delete
    {
    [RoutePrefix("api/test/")]
    public class TestController : ApiController
    {
        [Route("name")]
        public string Get(string param)
        {
            return param + 1;
        }
    
        [Route("age")]
        public int Get(int param)
        {
            return param + 1;
        }
      }
    }
    

    我在想,上述API可以很容易地在各个端点提供服务。

    http://localhost:51370/api/test/name?param=Chetan
    
    http://localhost:51370/api/test/age?param=28
    

    但这是返回下面的错误。

    { http://localhost:51370/api/test/age?param=28 '.", “MessageDetail”:“在控制器‘Test’上找不到与名称‘age’匹配的操作。” }

    WebAPIConfig.cs网站

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

    我该怎么解决这个问题??

    谢谢。

    3 回复  |  直到 6 年前
        1
  •  3
  •   Nkosi    6 年前

    / 从路由前缀,它的工作。

    因此,您的问题是在路由前缀中添加了斜杠,我认为这是不允许的。

    [RoutePrefix("api/test/")]
    

    导致以下错误

    “路由前缀 api/test/ 在名为 Test 不能以 / “字符”

    删除路由模板末尾的斜杠

    [RoutePrefix("api/test")]
    

    下面的内存测试用于验证预期的行为

    [TestClass]
    public class MyTestClass {
        [Test]
        public async Task __WebApi_Should_Match_Route() {
            //Arrange
            var config = new HttpConfiguration();
            config.MapHttpAttributeRoutes();
            var httpServer = new HttpServer(config);
            var client = new HttpClient(httpServer);
    
            //Act
            var response = await client.GetAsync("http://localhost/api/test/age?param=28");
            var returnJson = await response.Content.ReadAsStringAsync();
    
            //Assert
            response.IsSuccessStatusCode.Should().BeTrue();
    
            var result = JsonConvert.DeserializeObject<int>(returnJson);
            result.Should().Be(29);
        }
    }
    
    
    
    [RoutePrefix("api/test")]
    public class TestController : ApiController {
        [Route("name")]
        public string Get(string param) {
            return param + 1;
        }
    
        [Route("age")]
        public int Get(int param) {
            return param + 1;
        }
    }
    

    还要确保在基于约定的路由之前必须启用属性路由

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

    Attribute Routing in ASP.NET Web API 2

        2
  •  0
  •   Tom Johnson    6 年前

    [Route("name/{param=param}")]
    

    如果这不管用,试试:

    [HttpGet, Route("name/{param=param}")]
    

    相关的 Stackoverflow Q

        3
  •  0
  •   Mahesh Gaikwad    6 年前
    namespace CTB_APP.Controllers.API.Delete
    {
    [RoutePrefix("api/test/")]
    public class TestController : ApiController
    {
        [Route("name/{param}")]
        public string Get(string param)
        {
        return param + 1;
        }
    
       [Route("age/{param}")]
       public int Get(int param)
       {
          return param + 1;
       }
     }
    }
    

    终点1: http://localhost:51370/api/test/name/mm 终点2: http://localhost:51370/api/test/age/9