Web Api Controller в другом проекте, атрибут маршрута не работает

У меня есть решение с двумя проектами. Один проект загрузки Web Api, а другой - библиотека классов.

Библиотека классов содержит ApiController с маршрутизацией атрибутов. Я добавляю ссылку из проекта web api в библиотеку классов и ожидаю, что это просто сработает.

Настройка маршрутизации в веб-api:

config.MapHttpAttributeRoutes();

Контроллер прост и выглядит следующим образом:

public class AlertApiController:ApiController
{
    [Route("alert")]
    [HttpGet]
    public HttpResponseMessage GetAlert()
    {
        return Request.CreateResponse<string>(HttpStatusCode.OK,  "alert");
    }
}

Но я получаю 404 при переходе на url "/alert".

Что мне здесь не хватает? Почему я не могу использовать этот контроллер? Сборка определенно загружена, поэтому я не думаю, что http://www.strathweb.com/2012/06/using-controllers-from-an-external-assembly-in-asp-net-web-api/ является ответом здесь.

Любые идеи?

Ответ 1

Попробуйте это. Создайте класс в проекте библиотеки классов, который выглядит следующим образом:

public static class MyApiConfig {


  public static void Register(HttpConfiguration config) {
      config.MapHttpAttributeRoutes();
  }
}

И везде, где вы в настоящее время вызываете config.MapHttpAttributeRoutes(), вместо этого звоните MyApiConfig.Register(config).

Ответ 2

Возможно, у вас есть 2 маршрута на разных контроллерах с тем же именем.

У меня было два контроллера, названных "UploadController", каждый в другом пространстве имен, каждый из которых был декорирован другим [RoutePrefix()]. Когда я попытался получить доступ к любому маршруту, я получил 404.

Он начал работать, когда я изменил имя одного из контроллеров. Кажется, что атрибут Route Attribute используется только для имени класса и игнорирует пространство имен.

Ответ 3

Мы пытались решить подобную проблему. Маршруты внутри внешней сборки не регистрировались правильно. Мы обнаружили еще одну деталь при попытке решения, показанного на этой странице. Вызов внешней сборки "MyApiConfig.Register" должен был появиться перед вызовом MapHttpRoute

HttpConfiguration config = new HttpConfiguration();
MyExternalNamespace.MyApiConfig.Register(config); //This needs to be before the call to "config.Routes.MapHttpRoute(..."
config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );