Как использовать MVC-контроллер и WebAPI-контроллер в том же проекте

Я пытаюсь использовать контроллер MVC и контроллер WebAPI в одном проекте, но я получил 404 ошибки для webapi. Я начал проект как MVC Project в vs 2015, но затем добавил элемент управления webapi, и с кодом по умолчанию он выдает ошибку 404

какое может быть возможное решение. Я попробовал какое-то решение на Stackoverflow, но они не сработали, один из них ниже ссылки (Принято там). Все контроллеры ASP.NET Web API возвращают 404

Код файла Global.ASAX:

protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);//WEB API 1st
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

        }

WEBAPI.CONFIG FILE

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

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

        }
    }

Код файла конфигурации маршрута

  public class RouteConfig
    {
        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 }
            );

        }
    }

КОД контроллера WebAPI

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using O365_APIs_Start_ASPNET_MVC.Models;
using Microsoft.IdentityModel.Clients.ActiveDirectory;
using O365_APIs_Start_ASPNET_MVC.Helpers;
using System.Threading.Tasks;

namespace O365_APIs_Start_ASPNET_MVC.Controllers
{
    public class MAILAPIController : ApiController
    {
        private MailOperations _mailOperations = new MailOperations();
        //async Task<BackOfficeResponse<List<Country>>>

        // GET: api/MAILAPI
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

        // GET: api/MAILAPI/5
        public string Get(int id)
        {
            return "value";
        }

        // POST: api/MAILAPI
        public void Post([FromBody]string value)
        {
        }

        // PUT: api/MAILAPI/5
        public void Put(int id, [FromBody]string value)
        {
        }

        // DELETE: api/MAILAPI/5
        public void Delete(int id)
        {
        }
    }
}

ТАКЖЕ ПОЛУЧЕНИЕ ОШИБКИ ВОССТАНОВЛЕНИЯ NUGET В ТО ЖЕ РЕШЕНИЕ Ошибка Nuget не удалось восстановить PNG

Ответ 1

Вам необходимо зарегистрировать маршрутизацию для web api ПЕРЕД, регистрируя маршрутизацию для MVC, поэтому в основном ваша функция App_Start() должна выглядеть так:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    GlobalConfiguration.Configure(WebApiConfig.Register);//WEB API 1st
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);//MVC 2nd
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}

Ответ 2

Просто добавьте одну строку в метод Application_Start() глобальной страницы asax.

введите описание изображения здесь

Ответ 3

У вас есть два маршрута, которые отображаются одинаково. Либо удалите delete (id), либо get (id). Кроме того, вы можете добавить действие в свой маршрут.

Ответ 4

вы можете написать обе конфигурации в одном файле, как это

public class RouteConfig
{
    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 }
        );

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

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

    }
   }

в файле Global.aspx редактируйте код, например this--

protected void Application_Start()
{
   AreaRegistration.RegisterAllAreas();
   GlobalConfiguration.Configure(RouteConfig.Register);//WEB API 1st
   FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
   RouteConfig.RegisterRoutes(RouteTable.Routes);//MVC 2nd
   BundleConfig.RegisterBundles(BundleTable.Bundles);
}