出于支持性原因,我将.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
答案 0 :(得分:1)
在.Net Core中,默认情况下现在启用属性路由。但是,在MVC5中,您需要进行设置。在您的路线配置中,添加以下内容:
routes.MapHttpAttributeRoutes();
请注意,对于普通的MVC(即不是 WebAPI),您需要使用以下命令:
routes.MapMvcAttributeRoutes();
注意: MapHttpAttributeRoutes
是System.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 }
);
}