Действие контроллера по умолчанию для веб-API в Asp.Net MVC - PullRequest
0 голосов
/ 11 января 2019

Мой веб-API в веб-приложении Asp.Net MVC возвращает ошибку 404 при получении запросов, в которых не указан контроллер. Вызовы, которые возвращают ошибку 404:

https://myWebApp/api/

Цель состоит в том, чтобы обрабатывать запросы такого типа без возврата ошибки и возвращать что-то вроде «true» или «new EmptyResult ()».

Текущая маршрутизация для Web API включает следующее в WebApiConfig.cs

public static class WebApiConfig
    {                
        public static void Register(HttpConfiguration config)
        {   
            config.Filters.Add(new IdentityBasicAuthenticationAttribute());

            config.MapHttpAttributeRoutes();

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

Хотя у меня есть маршруты, явно определенные для каждого контроллера API:

[IdentityBasicAuthentication]
[Authorize]
public class myApi1Controller : ApiController
{
    [HttpGet]
    [Route("api/myApi1")]
    public string Get(string id) { ... }
}

Я попытался перенаправить эти вызовы на API по умолчанию или контроллер MVC, но безуспешно.

Мой текущий RouteConfig для приложения MVC:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            namespaces: new[] { "myWebApp.Controllers" }
        );
    }
}

Порядок, в котором они называются:

protected void Application_Start()
{                    
    AreaRegistration.RegisterAllAreas();                
    GlobalConfiguration.Configure(WebApiConfig.Register); 
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Создайте контроллер для обработки этого маршрута, чтобы он не перестал работать, если не найдено

Как

[RoutePrefix("api")]
public class MyEmptyController : ApiController {
    //GET api
    [HttpGet]
    [Route("")]
    public IHttpActionResult Get() { 
        return StatusCode(HttpStatusCode.NoContent); //204
    }
}

Использование атрибутной маршрутизации, поскольку она уже включена через config.MapHttpAttributeRoutes(); в WebApiConfig

0 голосов
/ 11 января 2019

Ваша конфигурация маршрута отличается от вашей конфигурации WebApi, и я не знаю, в каком порядке вы их вызываете.

в вашем RouteConfig:

  url: "{controller}/{action}/{id}",

, что означает: http://localhost:PORTNUMBER/myApi1/ACTION

в вашем WebApiConfig

routeTemplate: "api/{controller}/{id}",

(метод и идентификатор являются необязательными) что означает: http://localhost:PORTNUMBER/api/myApi1/?id=value

измените свой WebApiConfig, и вы даже сможете избежать использования тега Route в вашем контроллере:

  [IdentityBasicAuthentication]
    [Authorize]
    public class myApi1Controller : ApiController
    {
        [HttpGet]
        public string Get(string id) { 
    return "works!";
     }
    }

Edit: Сохраняйте все то же самое. Вызовите метод GET по умолчанию из: http://localhost:PORTNUMBER/api/myApi1

...