ApiController与404异常不起作用。

11 浏览
0 Comments

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派生的控制器,它工作得很好。

任何指点都将对我有很大帮助。

0
0 Comments

问题出现的原因是没有正确配置WebApi的路由。解决方法是在定义路由之前添加以下代码:

config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional });

如果已经在WebApiConfig的Register方法中定义了这段代码,那么可能是因为添加了`config.MapMvcAttributeRoutes()`导致出现404异常。可以尝试添加`config.MapMvcAttributeRoutes()`来解决问题。

0
0 Comments

问题的出现原因:

使用WebApiConfig.Register(Orbit.WebApi.Extensions.Startup.Config);而不是GlobalConfiguration.Configure(WebApiConfig.Register);会导致ApiController与404异常无法正常工作。

解决方法:

WebApiConfig.Register(Orbit.WebApi.Extensions.Startup.Config);替换为GlobalConfiguration.Configure(WebApiConfig.Register);

0