Было найдено несколько действий, соответствующих запросу в Web Api с использованием маршрутизации атрибутов. - PullRequest
0 голосов
/ 28 ноября 2018

Из любопытства я пытался создать 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": "В контроллере" 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 ]

0 голосов
/ 28 ноября 2018

Когда я проверял это, я инстинктивно удалял дополнительную косую черту / из префикса маршрута, и это работало.

Поэтому ваша проблема в том, что у вас есть дополнительный слеш в префиксе маршрута, который, я считаю, недопустим.

[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

0 голосов
/ 28 ноября 2018
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

0 голосов
/ 28 ноября 2018

Похоже, что вы не указали самому маршруту, чтобы он ожидал параметр, попробуйте зарегистрировать свои атрибуты для ваших маршрутов как:

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

И если это не сработает, попробуйте:

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

Связано Stackoverflow Q

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...