2017-02-01 3 views
1

지원 가능성을 이유로 .Net Core에서 ReactJs로 .NET MVC로 응용 프로그램을 이식하고 있습니다.404 MVC로 .Net Core 응용 프로그램을 포팅 한 후의 오류

또한 상태 처리에는 Redux가 사용됩니다.

이것은 정상적으로 보였지만 어떤 이유로 WebAPI 호출이 모두 404 오류로 실패합니다.

저는 라우팅이 실패한 전화에 따라 정확하다고 확신하지만 뭔가 어딘가에서 길을 잃고 있습니다.

엔트리 포인트로 추가 된 기본 MVC 컨트롤러는 정상적으로 작동하지만, 실패한 것처럼 보이는 포트 된 WebAPI 컨트롤러 일뿐입니다.

나는 상업적인 이유로 전체 코드를 게시 할 수 있지 않다 그러나 이것은 컨트롤러와 문제가되는 작업 중 하나가 모습입니다

: (나 추가 의견을 싹둑)

namespace Api.Controllers 
{ 
    /// <summary> 
    /// Account management. 
    /// </summary> 
    [Authorize] 
    [System.Web.Http.RoutePrefix("api/account")] 
    public class AccountController : ApiController 
    { 
     // <snip> 

     /// <summary> 
     /// Current logged in account. 
     /// </summary> 
     // GET api/Account/UserInfo 
     [HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)] 
     [System.Web.Http.Route("userinfo")] 
     public async Task<UserInfoViewModel> GetUserInfo() 
     { 
      ExternalLoginData externalLogin = ExternalLoginData.FromIdentity(User.Identity as ClaimsIdentity); 
      var userName = User.Identity.GetUserName(); 
      var account = new AccountRepresentation(await _context 
       .Accounts 
       .SingleOrDefaultAsync(acc => acc.Email == userName)); 
      return new UserInfoViewModel 
      { 
       Account = account, 
       UserName = User.Identity.GetUserName(), 
       Email = User.Identity.GetUserName(), 
       HasRegistered = externalLogin == null, 
       LoginProvider = externalLogin != null ? externalLogin.LoginProvider : null, 
       Roles = await UserManager.GetRolesAsync(User.Identity.GetUserName()) 
      }; 
     } 

     // </snip> 
    } 
} 

라우팅 속성에 주목하십시오. 모든 것을 시도하면서 조금 위에 있습니다. 그러나 내가 알 수있는 한, 이것은 괜찮을 것입니다. 그러나 브라우저 콘솔에서 나는 이것을보고 있어요 :

자원을로드하지 못했습니다 : 서버가 404 (찾을 수 없음) 의 상태로 응답 http://localhost:49690/api/account/userinfo

포트 번호가에 대한 올바른 어떤 이유로 든 다른 컨트롤러와 다른 경우가 아니라면이 컨트롤러도 괜찮습니다.

namespace Api 
{ 
    public class WebApiApplication : System.Web.HttpApplication 
    { 
     protected void Application_Start() 
     { 

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

      log4net.Config.XmlConfigurator.Configure(); 
     } 
    } 
} 
:
namespace Api 
{ 
    public static class WebApiConfig 
    { 
     public static void Register(HttpConfiguration config) 
     { 

      // Web API routes 
      config.MapHttpAttributeRoutes(); 

      config.Routes.MapHttpRoute(
       name: "DefaultApi", 
       routeTemplate: "api/{controller}/{id}", 
       defaults: new { id = RouteParameter.Optional } 
      ); 
      // Web API configuration and services 
      // Web API routes 
      // config.MapHttpAttributeRoutes(); 
      // Configure Web API to use only bearer token authentication. 
      //   config.SuppressDefaultHostAuthentication(); 
      //   config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); 
      //config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; 

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

Application_Start()

이처럼 다음과 같이

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

      routes.MapMvcAttributeRoutes(); 

      routes.MapRoute(
       name: "Default", 
       url: "{controller}/{action}/{id}", 
       defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
       namespaces: new[] { "Api.Controllers" } 
      ).DataTokens.Add("area", "UI"); 

      routes.MapRoute(
       name: "api", 
       url: "api/{controller}/{action}/{id}", 
       defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
       namespaces: new[] { "Api.Controllers" } 
      ).DataTokens.Add("area", "UI"); 

     } 
    } 
} 

WebApiConfig 파일을 찾습니다

나는 다음과 같이 현재 보이는 RouteConfig.cs 파일과 함께 놀았 던

내가 누락되거나 잘못 될 수있는 것은 무엇입니까? API 작업을 찾지 못하게합니까?

비주얼 스튜디오 버전 : 기업 2015 업데이트 3

.NET 버전 : 4.6.1

+0

아무 것도 작동하지 않습니다. 이제는 처음부터 새로운 프로젝트를 시작하고 한 번에 하나의 컨트롤러에 코드를 추가하는 것을 고려하고 있습니다. – CompanyDroneFromSector7G

답변

1

기타 세부 사항 (나 다른 코드가 도움이 될 것입니다 알고하자) 닷넷 코어에서는 속성 라우팅이 기본적으로 활성화됩니다. 그러나 MVC5에서는이를 설정해야합니다. 경로 구성에 다음을 추가합니다.

routes.MapHttpAttributeRoutes(); 

정상적인 MVC (예 :하지 WebAPI) 대신이 명령을 필요

routes.MapMvcAttributeRoutes(); 

참고 :MapHttpAttributeRoutes 그래서 당신이 using System.Web.Http; 문이 필요합니다 System.Web.Http에서 확장 방법이다.

+0

감사합니다. 'routes.MapMvcAttributeRoutes()'를 추가했지만 도움이되지 않습니다. 그러나'MapHttpAttributeRoutes'는'routes'의 메소드처럼 보이지 않습니다 - 이것을 사용하는 방법을 온라인에서 찾고 있습니다. – CompanyDroneFromSector7G

+1

['MapHttpAttributeRoutes'] (https://msdn.microsoft.com/en-us/library/dn479134(v=11118).aspx)는'System.Web.Http'의 확장 메서드이므로 필요합니다 'using System.Web.Http;'문을 사용합니다. – DavidG

+0

그랬습니까 - 여전히 그것을 볼 수 없습니다. 노력을 계속할 것입니다 ... – CompanyDroneFromSector7G

1

.net mvc에서 .net Core 응용 프로그램을 이식하는 경우 WebApiConfig 파일을 추가하고 전역 파일에 등록해야합니다. 그리고 이렇게되어야합니다. 속성 라우팅을 사용하기 때문에 먼저 라우트 속성을 사용하십시오.

public static void Register(HttpConfiguration config) 
    { 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

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