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

时间:2019-01-11 13:38:06

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

Asp.Net MVC Web应用程序上的我的Web API在收到未指定任何控制器的请求时返回404错误。 返回404错误的调用是:

  

https://myWebApp/api/

目标是处理这些类型的请求而不会返回错误并返回诸如“ true”或“ newEmptyResult()”之类的东西。

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

2 个答案:

答案 0 :(得分:1)

创建一个控制器来处理该路由,这样它就不会因找不到路由而失败

喜欢

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

使用已通过 WebApiConfig

中的config.MapHttpAttributeRoutes();启用的属性路由

答案 1 :(得分:0)

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

在您的RouteConfig中:

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

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

在您的WebApiConfig中

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

(方法和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