首页 > 解决方案 > Asp.Net MVC 中 Web API 的默认控制器操作

问题描述

当接收到未指定任何控制器的请求时,我在 Asp.Net MVC Web 应用程序上的 Web API 返回 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 控制器,但没有成功。

我当前的 MVC 应用程序的 RouteConfig 是:

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);
}

标签: c#asp.net-web-apiasp.net-web-api2asp.net-web-api-routing

解决方案


创建一个控制器来处理该路由,使其不会因未找到而失败

喜欢

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

使用属性路由,因为它已通过config.MapHttpAttributeRoutes();WebApiConfig启用


推荐阅读