ApiController не работает с 404 ожидания - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть контроллер, полученный из System.Web.Http.ApiController (используется пакет Nuget Microsoft.AspNet.WebApi.Core.5.2.3).

Я использовал RoutePrefix для класса контроллера иАтрибут маршрута в действии.

У меня настроены два маршрута.Один в 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 }
        );

Когда я нажимаю на запрос от Почтальона.Я получаю код ошибки 404.И странно, что трассировка стека выглядит так:

[HttpException]: The controller for path '/api/Account/IsAuthorized' was not found or does not implement 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
{
    /// <summary>
    /// Determines whether this instance is authorized.
    /// </summary>
    /// <returns>send whether the user is authorized or not</returns>
    [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 и работает хорошо.

Любые указатели мне очень помогут.

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Добавление

GlobalConfiguration.Configure(WebApiConfig.Register);

вместо

WebApiConfig.Register(Orbit.WebApi.Extensions.Startup.Config);

у меня сработало.Я должен выяснить, какова реальная разница между этими двумя строками, когда речь заходит о контроллерах WebAPI.

Я помню, я читал в каком-то месте, что это просто улучшение.Но это может иметь большое значение, чего я не знал.

Будет очень признателен, если кто-нибудь сможет пролить свет на это.

0 голосов
/ 30 ноября 2018

Перед определением ваших маршрутов добавьте:

config.MapHttpAttributeRoutes();

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

Подробнее здесь

...