Обнаружено несколько действий, соответствующих запросу в 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

Другие вопросы по тегам