【问题标题】:Default controller action for Web API in Asp.Net MVCAsp.Net MVC 中 Web API 的默认控制器操作
【发布时间】: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);
}

【问题讨论】:

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


    【解决方案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:port{controller}/{action}/{id} 其中 id 和 Action 是可选的
      • "改变你的 WebApiConfig,你甚至可以避免在你的控制器中使用 Route 标签:"对不起,我没有明白。我应该在 WebApiConfig 中更改什么?
      猜你喜欢
      • 2012-08-14
      • 1970-01-01
      • 2016-08-23
      • 2018-12-16
      • 1970-01-01
      • 2016-02-28
      • 2016-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多