Предположим, у меня есть очень простую таблицу маршрутизации, как это:Почему некоторые типы параметров вызывают неоднозначную маршрутизацию в ASP.NET Web API?
routes.MapHttpRoute("root", "",
new { controller = "Home", action = "Index" });
И в моей HomeController
, я два метода под названием Index
:
[HttpGet]
public IHttpActionResult Index()
{
return Content(HttpStatusCode.OK, new { service = "hard-coded string" });
}
[HttpGet]
public IHttpActionResult Index(string a)
{
return Content(HttpStatusCode.OK, new { a });
}
Если я запускаю это приложение, происходит маршрутизация как и следовало ожидать: если я опустил параметр a
из строки запроса, мой запрос будет перенаправлен на первый метод, и если я его включу, запрос будет перенаправлен ко второму методу.
Однако, если изменить тип a
для более сложного типа, например string[]
, а затем, когда я сделать запрос на маршрут по умолчанию, я получаю следующее сообщение об ошибке (независимо от того, я указал параметр запроса):
{
Message: "An error has occurred."
ExceptionMessage: "Multiple actions were found that match the request: Index on type SurveysApi.v1.Web.Controllers.HomeController Index on type SurveysApi.v1.Web.Controllers.HomeController"
ExceptionType: "System.InvalidOperationException"
StackTrace: " at System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext) at System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken) at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncCore(HttpRequestMessage request, CancellationToken cancellationToken) at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__0.MoveNext()"
}
ошибка остается, если даже если я указываю FromUri
или ModelBinder
атрибуты параметра.
Почему эта ошибка возникает для сложных типов, и есть ли способ избежать ее, если не указать простой тип в списке аргументов и выполнить необходимые преобразования в методе контроллера?
похоже, что это может быть проблема с сериализацией, я не знаю, какую кодировку вы используете, но когда передаваемый json-объект передается атрибуты, которые являются нулями, просто пропущены из сериализации. это вызовет URL-адрес по умолчанию и URL-адрес, чтобы объект, такой как нулевой массив, имел один и тот же URL-адрес в запросе на получение, так что да, было бы два действия, которые соответствуют этому URL-адресу – theDarse