Было найдено несколько действий, соответствующих запросу, когда я добавляю другой метод в контроллер (RPC)

1

Я разрабатываю ASP.NET MVC 4 Web Api с С# и.NET Framework 4.0.

У меня проблемы с этим контроллером:

public class ASManagementController : ApiController
{
    private readonly IExceptionLogHelper m_ExceptionLoggerHelper;

    public ASManagementController(IExceptionLogHelper exceptionLoggerHelper)
    {
        m_ExceptionLoggerHelper = exceptionLoggerHelper;
    }

    [HttpGet]
    public HttpResponseMessage IsConnected()
    {
        [ ... ]
    }

    [HttpPut]
    public HttpResponseMessage DoConnect()
    {
        [ ... ]
    }

    [HttpPut]
    public HttpResponseMessage DoReset()
    {
        [ ... ]
    }
}

Это мой класс WebApiConfig:

public static class WebApiConfig
{     
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        // More routes...

        config.Routes.MapHttpRoute(
            name: "ASActionApi",
            routeTemplate: "api/asManagement/{action}",
            defaults: new { controller = "ASManagement" });
    }
}

Когда я делаю https://localhost:44300/api/asManagement/DoConnect я получаю следующую ошибку:

Multiple actions were found that match the request:
"ExceptionMessage":
   "System.Net.Http.HttpResponseMessage DoConnect() in type MyPtoject.Web.Api.Controllers.ASManagementController
    System.Net.Http.HttpResponseMessage DoReset() in type MyPtoject.Web.Api.Controllers.ASManagementController",
"ExceptionType":"System.InvalidOperationException"

Как я могу исправить эту ошибку?

Если я doConnect метод doConnect на ASManagementController он будет работать. Ты знаешь почему?

Не очень чистое решение - переместить ASActionApi defintion перед DefaultApi WebApiConfig классе WebApiConfig.

  • 0
    Это все методы в ASManagementController? или есть такие, которые имеют атрибут actionname, указывающий DoConnect в качестве имени действия? и есть ли какие-либо маршруты, определенные до ASActionApi, которые могут соответствовать URL-адресу запроса?
  • 0
    Да, это все методы. Нет, нет маршрута, который мог бы соответствовать запрошенному URL.
Теги:
asp.net-web-api
asp.net-mvc-4

1 ответ

1
Лучший ответ

Попробуйте поставить ASActionApi перед DefaultApi.

Входящие URL-адреса сравниваются с маркерами маршрутов в том порядке, в котором посетители появляются в словаре маршрутов (это то, к чему мы добавили карты маршрутов в наш файл RouteConfig.cs). Первый маршрут, который успешно сопоставляет параметры контроллера, действия и действия с параметрами в URL-адресе или значениями по умолчанию, определенными как часть карты маршрута, вызывается в указанный контроллер и действие.

  • 0
    Я сделал то, что вы предложили, и это работает. Но я не понимаю почему. Если я ничего не изменяю в WebApiConfig и doConnect метод doConnect в ASManagementController он работает.
  • 0
    Я считаю, что правила маршрутизации по умолчанию для ApiController допускают только один Get и один Put. Если у вас есть несколько путов, то он не знает, какой из них выбрать. Решением Raven является переопределение правил маршрутизации по умолчанию, перемещая ASActionApi перед DefaultApi.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню