Mvc с веб-Api — не найден тип, соответствующий названию контроллера

#c# #asp.net #asp.net-mvc #asp.net-web-api

#c# #asp.net #asp.net-mvc #asp.net-web-api

Вопрос:

Я пытаюсь добавить веб-сервис в свой проект mvc с помощью web api. При создании проекта я выбрал для этого Mvc Web Api.

Однако я не могу получить доступ к контроллеру api, я продолжаю получать эту ошибку:

 <Error>
    <Message>
        No HTTP resource was found that matches the request URI 'http://www.myapp.app/api/sms'.
    </Message>
    <MessageDetail>
        No type was found that matches the controller named 'sms'.
    </MessageDetail>
</Error>
  

Мой global.asax :

 AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
BundleMobileConfig.RegisterBundles(BundleTable.Bundles);
  

Мой RouteConfig.cs :

 public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

Мой WebApiConfig.cs :

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

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

}
  

Мой контроллер Api:

 public class SmsController : ApiController
{
    private DbContext db = new DbContext();

    // GET: api/Sms
    public IQueryable<Sms> GetSms()
    {
        return db.Sms;
    }
    ...
}
  

Естественно, я пытаюсь получить доступ к api через http://www.myapp.app/api/sms .

Я буквально перепробовал все, что мог придумать, и прочитал о каждом соответствующем вопросе на SO и других форумах, но мне ничего не помогло. Я почти уверен, что это связано с моим URL-адресом приложения, который не является обычным localhost:port , я изменил его www.myapp.app , и он работает на порту 80.

Для этого мне пришлось изменить привязки IIS, чтобы они выглядели как *:80:www.myapp.app , а также добавил эту запись в drivers/etc/hosts файл : 127.0.0.1 www.myapp.app .

На данный момент я почти уверен, что именно это вызывает мою проблему.

Есть идеи?

Application Insights говорит, что мои запросы, по-видимому, отображаются правильно:

Анализ приложений, говорящий о попытках запроса

Также это показывает, что следующие запросы были сопоставлены с этим контроллером и действием:

ПОЛУЧИТЬ sms
ПОЛУЧИТЬ Sms / GetSms
ПОЛУЧИТЬ sms / getsms
ПОЛУЧИТЬ sms / Индекс
ПОЛУЧИТЬ Sms
ПОЛУЧИТЬ / api / sms

Комментарии:

1. Работает ли он на вашем локальном компьютере с localhost ?

2. Я пытаюсь на своем локальном компьютере, я просто изменил URL-адрес проекта с localhost на myapp. С новым проектом, оставляя URL-адрес нетронутым, да, это работает. Я не могу понять, как настроить веб-api с пользовательским URL. Контроллеры MVC отображаются просто отлично, однако контроллеры WebAPI…

3. если вы используете маршрутизацию на основе соглашений, вам нужно указать Get() метод, если вы хотите GET http://www.myapp.app/api/sms работать

4. но если OP использует маршрутизацию атрибутов, как я ответил, это не должно быть проблемой с именем метода, но strill не работает

5. VIsual studio автоматически сгенерировала этот контроллер, и, исходя из того, как работает webapi, мне не нужно переименовывать запросы. GetSms подразумевает, что любой запрос GET на Sms будет сопоставлен этому действию. Это очень похоже на наличие суффикса контроллера в контроллерах. Я мог бы получить GetThisIsATests и получить к нему доступ с помощью /api/thisisatest, и это сработало бы. Я также мог бы иметь PostBlaBla и получить к нему доступ с помощью POST в /api/blabla

Ответ №1:

Используйте атрибутивную маршрутизацию

 public class SmsController : ApiController
{
    private DbContext db = new DbContext();

    // GET: api/Sms
    [HttpGet]
    [Route("api/sms")]
    public IQueryable<Sms> GetSms()
    {
        return db.Sms;
    }
    ...
}
  

если номер порта 80 , то его добавлять не нужно, но если отличается, 80 то URL

http://www.myapp.app:portnumber/api/sms

Комментарии:

1. добавьте номер порта в URL

2. попробуйте получить доступ к myapp.app: portnumber/Home/Index это работает?

3. По-прежнему ничего =/ Я почти уверен, что это как-то связано с тем, что я определил другой URL iis, потому что я тестировал его в новом проекте, и точно такая же настройка работает просто отлично

4. /Home/Index работает просто отлично. Он отлично работает для MVC-контроллеров, но не работает для контроллеров WebAPI

5. вы можете попробовать восстановить пакеты nuget, попробуйте снова добавить webapi.