ApiController与404异常不起作用。
ApiController与404异常不起作用。
我有一个控制器,它是从System.Web.Http.ApiController派生而来的(使用了Nuget包Microsoft.AspNet.WebApi.Core.5.2.3)。
我在控制器类上使用了RoutePrefix,而在Action上使用了Route属性。
我配置了两个路由。一个在WebAPiConfig(HttpRouteCollection)中,另一个在RouteConfig(System.Web.Routing.RouteCollection)中。
config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional }); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } );
当我在Postman中发送请求时,我收到了404错误代码。奇怪的是堆栈跟踪是:
[HttpException]: 路径“/api/Account/IsAuthorized”的控制器未找到或未实现IController。 at System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) at System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) at System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step) at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
以下是控制器代码:
using System; using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Net.Security; using System.Security.Cryptography.X509Certificates; using System.Text; using System.Threading.Tasks; using System.Web; using System.Web.Http; using System.Web.Http.Description; [RoutePrefix("api/Account")] public class AccountController : ApiController { ////// Determines whether this instance is authorized. /// ///send whether the user is authorized or not [AllowAnonymous] [Route("IsAuthorized")] [HttpGet] public HttpResponseMessage IsAuthorized() { return Request.CreateResponse(User.Identity.IsAuthenticated); ////return true; } }
Global.asax的注册顺序
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); UnityConfig.RegisterComponents(HttpConfiguration.Config); WebApiConfig.Register(HttpConfiguration.Config); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); }
为什么框架尝试通过System.Web.Mvc.DefaultControllerFactory.GetControllerInstance来初始化控制器
在同一个API项目中,我有另一个由System.Web.Mvc.Controller派生的控制器,它工作得很好。
任何指点都将对我有很大帮助。
问题出现的原因是没有正确配置WebApi的路由。解决方法是在定义路由之前添加以下代码:
config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional });
如果已经在WebApiConfig的Register方法中定义了这段代码,那么可能是因为添加了`config.MapMvcAttributeRoutes()`导致出现404异常。可以尝试添加`config.MapMvcAttributeRoutes()`来解决问题。