Не удается заставить Route работать в ASP.Net Web API 2 при наследовании контроллера - PullRequest
2 голосов
/ 20 марта 2019

Я пытаюсь заставить это работать в моем приложении ASP.Net Web API 2.Вы заметите, что этот контроллер наследует контроллер.Это потому, что мне нужно вернуть представление вместо JSON.

[RoutePrefix("api/Manage")]
public class ManageController : Controller
{
  [Route("TestOne")]
  public async Task<ActionResult> MyTestOne(string value1, string value2)
  {
    return View("");
  {
}

Вот ошибка, которую я получаю.

<error>
<MessageDetail> No type was found that matches the controller named 'Manage'.</MessageDetail>
</Error>

Мне нужно вызвать Manage Controller следующим образом.

https://api.domain.com/api/Manage/TestOne?value1=foo&value2=bar

Мой RouteConfig настроен следующим образом.

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
       name: "Default",
       url: "{controller}/{action}/{id}",
       defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
       );

ПРИМЕЧАНИЕ. [RoutePrefix ("api / Account")] работает в моем AccountController.Это API-контроллер и наследует ApiBase.

Любая помощь очень ценится!Спасибо!

1 Ответ

3 голосов
/ 21 марта 2019

Это происходит потому, что у вас есть 2 конфигурации маршрута, один для MVC контроллеров и один для Web API.И в вашем случае Web API настройка маршрута идет первым.Global.asax.cs выглядит следующим образом

//some configs
WebApiConfig.Register(GlobalConfiguration.Configuration);
//some configs
RouteConfig.RegisterRoutes(RouteTable.Routes);

И у вас должно быть что-то подобное в Web API route config

config.MapHttpAttributeRoutes();

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

Когда вы запрашиваете /api/Manage/TestOne, применяется Web API маршрутизацияпервый.Маршрут на основе атрибутов не подходит, но запрос полностью соответствует маршруту DefaultApi.Manage соответствует {controller}, а TestOne - {id}.Таким образом, фреймворк начинает поиск контроллера API с именем Manage вот так

public class ManageController : ApiController

Но такого контроллера нет, и действительно у вас есть ошибка

{
    "Message": "No HTTP resource was found that matches the request URI 'http://host/api/Manage/TestOne/?value1=foo&value2=bar'.",
    "MessageDetail": "No type was found that matches the controller named 'Manage'."
}

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

Изменить порядок конфигурации маршрута

//some configs
RouteConfig.RegisterRoutes(RouteTable.Routes);
//some configs
WebApiConfig.Register(GlobalConfiguration.Configuration);

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

Удалить DefaultApi route

Если вы полностью полагаетесь на маршрутизацию на основе атрибутов для Web API, вы можете просто удалить эту конфигурацию без отрицательныхэффект для вашего приложения

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

Или просто измените префикс

Если вы измените префикс с api на что-то еще, он будет работать, потому что он не будетматч DefaultApi маршрут больше

[RoutePrefix("view/Manage")]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...