2016-08-29 51 views
7

Próbuję użyć kontrolera MVC i kontrolera WebAPI w tym samym projekcie, ale mam 404 błędy dla webapi. Rozpocząłem projekt jako MVC Project w stosunku do 2015, ale potem dodałem obsługę webapi i domyślnym kodem daje błąd 404Jak używać kontrolera MVC i kontrolera WebAPI w tym samym projekcie

, co może być rozwiązaniem. Próbowałem jakieś rozwiązanie na StackOverflow, ale nie pracował jeden z nich jest poniżej linku (zaakceptowana Answer tam) All ASP.NET Web API controllers return 404

global.asax Kod pliku:

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 PLIK

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

     } 
    } 

Route Kod Config File

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 Controller KOD

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

także coraz Nuget RESTORE błąd w tym samym roztworze Error Nuget failed to restore PNG

+1

Jak wygląda kontroler tak próbujesz zadzwonić? –

+0

Gdzie nazywacie 'WebApiConfig.Register'? – Richard

+0

@MitchelSellers zamierza dodać kod kontrolera – user3177519

Odpowiedz

15

Musisz zarejestrować routing dla Web API PRZED rejestracji routing dla MVC , więc w zasadzie twoja funkcja App_Start() powinna wyglądać tak:

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

Przepraszam, że nie działa. Właściwie już to wypróbowałem, jeśli zobaczysz mój 5 komentarz w komentarzach pod spodem. Wspomniałem tam, że umieściłem ten wiersz kodu po RegisterAllAreas(). Zaktualizowałem też kod zapytania teraz: – user3177519

+2

Czy na pewno poprawnie wywołujesz kontroler api? Ponieważ działa on idealnie na mojej stronie. Spróbuj wywołać ten adres URL, ale oczywiście zamień mój numer portu na twój - http: // localhost: 37294/api/MAILAPI –

+0

Dzięki, że popełniłem jakiś głupi błąd. To może być również spowodowane przywróceniem nugetu po rozwiązaniu błędu nugetowego działa jak wdzięk – user3177519

0

Wystarczy dodać jedną linię w Method_Start() globalnej strony asax.

enter image description here