出于好奇,我试图使用大量的重载来构建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 }
);
我该如何解决?
谢谢。
答案 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 }
);
}
}
答案 1 :(得分:0)
似乎您没有告诉路由本身需要参数,请尝试将您的路由属性注册为:
[Route("name/{param=param}")]
如果那不起作用,请尝试:
[HttpGet, Route("name/{param=param}")]
答案 2 :(得分:0)
Primary Key
端点1:http://localhost:51370/api/test/name/mm 终点2:http://localhost:51370/api/test/age/9