将.Net Core应用程序移植到MVC后出现404错误

时间:2017-02-01 10:59:03

标签: c# asp.net-mvc asp.net-web-api .net-core react-redux

出于支持性原因,我将.Net Core的应用程序与ReactJs移植到.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版本:Enterprise 2015 update 3

.NET版本:4.6.1

2 个答案:

答案 0 :(得分:1)

在.Net Core中,默认情况下现在启用属性路由。但是,在MVC5中,您需要进行设置。在您的路线配置中,添加以下内容:

routes.MapHttpAttributeRoutes();

请注意,对于普通的MVC(即不是 WebAPI),您需要使用以下命令:

routes.MapMvcAttributeRoutes();

注意: MapHttpAttributeRoutesSystem.Web.Http中的扩展方法,因此您需要using System.Web.Http;语句。

答案 1 :(得分:1)

如果从.net mvc移植.net核心应用程序,则添加WebApiConfig文件并在全局文件中注册。它应该是这样的。首先使用Route Attribute,因为您已使用属性路由。

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