Asp.Net MVC 中 Web API 的默认控制器操作

Posted

技术标签:

【中文标题】Asp.Net MVC 中 Web API 的默认控制器操作【英文标题】:Default controller action for Web API in Asp.Net MVC 【发布时间】:2019-06-06 10:36:58 【问题描述】:

我在 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);

【问题讨论】:

【参考方案1】:

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

喜欢

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

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

【讨论】:

【参考方案2】:

您的路由配置与您的 WebApi 配置不同,我不知道您调用它们的顺序。

在您的 RouteConfig 中:

  url: "controller/action/id",

表示:http://localhost:PORTNUMBER/myApi1/ACTION

在您的 WebApiConfig 中

routeTemplate: "api/controller/id",

(method 和 id 是可选的) 这意味着:http://localhost:PORTNUMBER/api/myApi1/?id=value

更改您的 WebApiConfig,您甚至可以避免在控制器中使用 Route 标记:

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

编辑: 保持一切不变,从以下位置调用您的默认 GET 方法: http://localhost:PORTNUMBER/api/myApi1

【讨论】:

谢谢!我添加了调用它们的顺序。您能否详细说明我应该对 WebApiConfig 进行的更改? 检查我的更新,因为我们首先注册 web api,然后才注册路由,模式是:localhost:portcontroller/action/id 其中 id 和 Action 是可选的 "改变你的 WebApiConfig,你甚至可以避免在你的控制器中使用 Route 标签:"对不起,我没有明白。我应该在 WebApiConfig 中更改什么?

以上是关于Asp.Net MVC 中 Web API 的默认控制器操作的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Web API 控制器添加到现有的 ASP.NET Core MVC?

如何从 ASP.NET 核心 mvc 向 asp.net 核心中的 Web API 发出 PUT 请求?

Web APi Vs MVC 和在 ASP.net 核心 Web APi 中提供静态文件

asp.net mvc+web api+easyui

Asp.net MVC 与 Asp.net Web API 区别

了解 ASP.NET(MVC、Web API)中的令牌生成/验证