0

我正在尝试开发 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://localhost:52628/api/posts/5

(在我的浏览器中)产生一些结果,即函数 GET 被调用并返回一个值。

但是,当我尝试

hxxp://localhost:52628/api/posts/GetTest/MyTestToken/myTestMid

返回“找不到资源”错误消息。

我认为{Action}应该包含要调用的函数,并且“token”“mid”应该包含我指定的值。我做错了什么?

4

1 回答 1

0

ApiController 与常规 MVC 控制器的工作方式不同。在这里,方法名称(GET、POST、PUT、DELETE)表示 HTTP VERBS,而不是 url 片段。在您的第一次通话中,

/api/posts/5

这调用Get(int).

要按照您的意愿进行路由,请通过继承System.Web.Mvc.Controller而不是切换到标准 MVCSystem.Web.Http.ApiController并修改您的方法以返回ActionResult

于 2012-11-07T15:50:49.853 回答