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 中提供静态文件