为什么这个 Web Api 路由不起作用?

Why doesn't this Web Api route work?

我声明了这些路由和控制器:

public class RouteConfig
{
    public static readonly string MVC_ROUTING = "Default";
    public static readonly string WEB_API_ROUTING = "Api";

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapRoute(
          name: MVC_ROUTING,
          url: "{controller}/{action}/{id}",
          defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
          constraints: new { id = @"^[0-9]*$" }
      );

      routes.MapRoute(
          name: WEB_API_ROUTING,
          url: "api/{controller}/{action}/{id}",
          defaults: new {id = UrlParameter.Optional },
          constraints: new { id = @"^[0-9]*$" }
      );
    }
}

public class QuoteController : ApiController
{
    private readonly QuoteService quoteService;
    public QuoteController()
    {
        quoteService = new QuoteService();
    }

    // GET api/<controller>
    public IEnumerable<QuoteModel> Get()
    {
        return quoteService.GetAllQuotes().Map<QuoteModel>();
    }

    // GET api/<controller>/5
    public QuoteModel Get(int id)
    {
        return quoteService.GetQuoteById(id).Map<QuoteModel>();
    }

    // POST api/<controller>
    public HttpResponseMessage Post(QuoteModel quoteModel)
    {
        Quote quote = quoteModel.Map<Quote>();
        quoteService.AddNewQuote(quote);

        string uri = Url.Link(RouteConfig.WEB_API_ROUTING, new { id = quote.QuoteId,controller="Quote",action="Get"});
        return Request.CreateResponse(HttpStatusCode.OK, uri);
    }

    // PUT api/<controller>/5
    public void Put(QuoteModel quote)
    {
        quoteService.Update(quote.Map<Quote>());
    }

    // DELETE api/<controller>/5
    public void Delete(int id)
    {
        quoteService.DeleteQuote(id);
    }
}

我不明白为什么这些路线有效:

但是这个没有:

在您的 get 方法之上添加一个路由属性。

[Route("{id}")]
public QuoteModel Get(int id)
{
    return quoteService.GetQuoteById(id).Map<QuoteModel>();
}

部分问题是您在 RouteConfig 而不是 WebApiConfig 中注册了 Api 路由。 从 RouteConfig 中删除 Web Api 路由,然后打开 WebApiConfig.

您可能已经在 WebApiConfig 中设置了默认路由;更改其中的路线如下:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "Api",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional },
            constraints: new { id = @"\d*", action = @"[a-zA-Z]+" }
        );

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional },
            constraints: new { id = @"\d*" }
        );
    }
}

您现在应该可以到达上面列出的所有路线。 更好的选择是使用属性路由,您可以阅读 here.