web-dev-qa-db-fra.com

Comment utiliser MVC Controller et Web API Controller dans le même projet

J'essaie d'utiliser le contrôleur MVC et le contrôleur WebAPI dans le même projet, mais j'ai obtenu 404 erreurs pour Webapi. J'ai commencé le projet en tant que projet MVC en vs 2015, mais j'ai ensuite ajouté webapi controlle et avec le code par défaut, il génère une erreur 404

quelle pourrait être la solution possible. J'ai essayé une solution sur Stackoverflow, mais ils n'ont pas fonctionné. L'un d'entre eux est un lien ci-dessous (réponse acceptée) Tous les contrôleurs d'API Web ASP.NET renvoient 404

Code de fichier 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);

        }

FICHIER WEBAPI.CONFIG

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 }
            );

        }
    }

Code de fichier de configuration de route

  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 }
            );

        }
    }

Code du contrôleur 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)
        {
        }
    }
}

OBTENTION ÉGALEMENT D'UNE ERREUR DE RESTAURATION DE NUGET DANS UNE MÊME SOLUTIONErreur de restauration de PNG non réussie

12
user3177519

Vous devez enregistrer le routage pour Web apiAVANTenregistrer le routage pour MVC. Par conséquent, votre fonction App_Start() devrait ressembler à ceci:

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);
}
21
Denys Wessels

Vous avez deux itinéraires mappant de la même manière. Supprimez delete (id) ou get (id). Alternativement, vous pouvez ajouter une action dans votre cartographie d'itinéraire. 

0
sharad shrestha

Ajoutez simplement une ligne dans la méthode Application_Start () de la page asax globale.

 enter image description here

0

vous pouvez écrire les deux configuration dans le même fichier comme celui-ci

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 }
        );

    }
   }

dans le fichier Global.aspx éditer le code comme 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);
} 
0
Mukesh Prajapati