Обнаружено несколько действий, соответствующих запросу в Web Api с использованием маршрутизации атрибутов.
Из любопытства я пытался построить API с количеством перегрузок.
Изначально я получал сообщение об ошибке ниже
- Найдено несколько действий, соответствующих запросу в Web Api.
Но, опять же, я хотел бы попробовать что-то иное, чем упомянуто в приведенной выше ссылке.
Я пошел вперед и украсил свой API [Route]
И вот как выглядит мой 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": "Не найден ресурс HTTP, соответствующий URI запроса ' http://localhost:51370/api/test/age?param=28'.", "MessageDetail": "На контроллере не найдено никаких действий "Тест", который соответствует названию "возраст"." }
Обратите внимание, что маршрутизация атрибутов включена.
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 ответа
Когда я проверил это, я инстинктивно удалил дополнительную косую черту /
из префикса маршрута и все заработало.
Поэтому ваша проблема в том, что у вас есть дополнительный слеш в префиксе маршрута, который, я считаю, не разрешен.
[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 }
);
}
}
Маршрутизация ссылочных атрибутов в ASP.NET Web API 2
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
Выглядит так, как будто вы не указали самому маршруту ожидание параметра, попробуйте зарегистрировать свои атрибуты для ваших маршрутов как:
[Route("name/{param=param}")]
И если это не сработает, попробуйте:
[HttpGet, Route("name/{param=param}")]
Связанные с Stackru Q