我正在尝试开发web api的asp.net mvc中的第一步。
我有以下路由功能:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "cdApiDefault",
url: "api/{controller}/{action}/{token}/{mid}/{id}",
defaults: new {
token = UrlParameter.Optional,
mid = UrlParameter.Optional,
id = RouteParameter.Optional }
);
}
和以下控制器:
namespace cdapi.Controllers
{
public class PostsController : ApiController
{
// GET api/posts
public IEnumerable<string> Get()
{
return new string[] { "GET_value1", "GET_value2" };
}
// GET api/posts/5
public string Get(int id)
{
return "value!!!!!!!!!!!!!!!!!";
}
// POST api/posts
public void Post([FromBody]string value)
{
}
// PUT api/posts/5
public void Put(int id, [FromBody]string value)
{
}
// DELETE api/posts/5
public void Delete(int id)
{
}
public String GetTest(String token, String mid)
{
return token + " - " + mid;
}
}
}
以下电话
hxxp://本地主机:52628 / API /帖/ 5
(在我的浏览器中)产生一些结果,即调用函数GET并返回一个值。
然而,当我尝试
时hxxp://本地主机:52628 / API /帖/ GetTest / MyTestToken / myTestMid
返回'无法找到资源'错误消息。
我认为 {Action} 应该包含要调用的函数,而'令牌'和'mid'应该包含我指定的值。我做错了什么?
答案 0 :(得分:0)
ApiControllers与常规MVC控制器的工作方式不同。这里,方法名称(GET,POST,PUT,DELETE)表示HTTP VERBS,而不是url片段。在第一次通话中,
/api/posts/5
这会调用Get(int)
。
要按照您的意愿进行路由,请通过继承System.Web.Mvc.Controller
而不是System.Web.Http.ApiController
切换到标准MVC并修改您的方法以返回ActionResult