使用属性路由发现多个与Web Api中的请求匹配的操作

时间:2018-11-28 13:30:35

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

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

最初,我遇到了以下错误

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

但是再次,我想以其他方式尝试上述链接中提到的其他方式。

我继续使用[Route]装饰API,这就是我的API的样子。

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

但这将返回以下错误。

  

{       “ Message”:“未找到与请求URI'http://localhost:51370/api/test/age?param=28'相匹配的HTTP资源。”,       “ MessageDetail”:“在与名称'age'相匹配的控制器'Test'上未找到任何动作。   }

请注意,属性路由已启用。

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 个答案:

答案 0 :(得分:2)

当我测试它时,我本能地从路由前缀中删除了额外的斜杠/并成功了。

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

[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

答案 1 :(得分:0)

似乎您没有告诉路由本身需要参数,请尝试将您的路由属性注册为:

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

如果那不起作用,请尝试:

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

相关的Stackoverflow Q

答案 2 :(得分:0)