2017-02-01 31 views
1

爲了支持性原因,我將.Net Core與ReactJs之間的應用程序移植到.Net MVC。將.NET核心應用程序移植到MVC後發生錯誤

這也使用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

的端口號是正確的默認的控制器,所以除非由於某種原因它與其他控制器不同,否則這應該是好的。

我一直在玩的RouteConfig.cs文件目前看起來如下:

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文件如下所示:

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

還有什麼可能會丟失或錯誤,我是否阻止發現API操作?

(讓我知道如果任何其他代碼將是有益的)

其他詳情:

的Visual Studio版本:2015年企業更新3

.NET版本:4.6.1

+0

到目前爲止沒有任何工作。我現在正考慮從頭開始一個新項目,並一次將代碼添加到一個控制器中。 – CompanyDroneFromSector7G

回答

1

在.Net Core中,屬性路由現在默認啓用。但是,在MVC5中,您需要設置它。在您的路由配置中,添加:

routes.MapHttpAttributeRoutes(); 

請注意,對於正常的MVC(即,的WebAPI),你需要這樣的命令:

routes.MapMvcAttributeRoutes(); 

注:MapHttpAttributeRoutesSystem.Web.Http所以你需要一個using System.Web.Http;語句的擴展方法。

+0

謝謝。我添加了'routes.MapMvcAttributeRoutes()',但這似乎沒有幫助。然而'MapHttpAttributeRoutes'似乎並不是'routes'的一種方法 - 我在網上尋找如何使用它。 – CompanyDroneFromSector7G

+1

['MapHttpAttributeRoutes'](https://msdn.microsoft.com/en-us/library/dn479134(v = vs.118).aspx)是'System.Web.Http'中的擴展方法,因此您需要'使用System.Web.Http;'語句。 – DavidG

+0

那是 - 仍然看不到它。將繼續嘗試... – CompanyDroneFromSector7G

1

如果從.net mvc移植.net核心應用程序,您已添加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 } 
     ); 
    } 
相關問題