2017-02-01 36 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 } 
     ); 
    } 
相关问题