and*_*ewb 2 c# asp.net-web-api
我之前玩过Web API,但似乎总是遇到我的方法无法路由到的相同问题。
我的应用程序具有该应用程序见解包,因此我可以看到它捕获了我提出的请求-通过查看方法签名上方的请求行,但它们从未真正执行过,并且App Insights报告失败的请求。
这是我的WebApiConfig
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
;
Run Code Online (Sandbox Code Playgroud)
这是我简单的控制器和方法
public class ExampleController : ApiController
{
[HttpGet]
[ActionName("Test")]
public IHttpActionResult Test()
{
return Ok();
}
}
Run Code Online (Sandbox Code Playgroud)
这是MVC应用程序的一部分,因此,当我启动项目时,“主页/索引”视图将显示在浏览器中。然后,我去邮递员创建一个新的Get请求,指向
http://localhost:port/api/Example/Test
Run Code Online (Sandbox Code Playgroud)
但这导致404。
我一定做错了,因为我总是碰到这个
WebAPI的默认映射不包括该操作作为路由的一部分,因为默认情况下,它希望控制器是资源的主要标识符,并希望GET / POST / PUT / DELETE动词来定义运行哪个操作。
因此,即使您手动指定ActionName为“ Test”,默认处理程序中也没有任何内容可以对其进行模式匹配。
您可以调整默认映射以包括操作,如下所示:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
;
Run Code Online (Sandbox Code Playgroud)
但是,您可能会发现您更喜欢属性路由(我知道),您可以将其应用于您的控制器,如下所示:
[RoutePrefix("api/Example")]
public class ExampleController : ApiController
{
[HttpGet]
[Route("Test")]
public IHttpActionResult Test()
{
return Ok();
}
}
Run Code Online (Sandbox Code Playgroud)
要启用属性路由,您将需要在启动配置中添加以下内容:
config.MapHttpAttributeRoutes();
Run Code Online (Sandbox Code Playgroud)