asp.net web api应用程序中的Route和RoutePrefix问题

时间:2016-03-11 10:54:46

标签: javascript c# ajax asp.net-mvc-5 asp.net-web-api2

我有一个web api应用程序,我需要在其中更改路由配置。

的Javascript

$.ajax({
        type: "GET", 
        url: "api/collaborators",
        success: function (data) {

        }});

在控制器中

[RoutePrefix("api/")]
public class AccountManageController : BaseApiController
{
    [Authorize]
    [HttpGet]
    [Route("collaborators")]
    public IEnumerable<CollaborateurModel> GetAllCollaborators() {...}
}

我收到异常,表明找不到该服务!!此外,即使我将网址直接放入浏览器中,我也会得到相同的结果。

WebApiConfig.cs

public static class WebApiConfig
{
    public static string UrlPrefix { get { return "api"; } }
    public static string UrlPrefixRelative { get { return "~/api"; } }

    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: WebApiConfig.UrlPrefix + "/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        config.Routes.MapHttpRoute(
            name: "DefaultApi2",
            routeTemplate: WebApiConfig.UrlPrefix + "/{controller}" 
        ); 
    }
}

我需要知道

  1. 问题的原因是什么?
  2. 我该如何解决?
  3. 谢谢,

2 个答案:

答案 0 :(得分:1)

属性路由和模板路由是两回事。

如果路由规则“匹配”已配置的路由模板,则无需添加自定义属性。

但是如果你想为'特殊'路由/动作使用属性 - 使用必须在路由注册逻辑中添加MapHttpAttributeRoutes()(在第一次config.Routes.MapHttpRoute...呼叫之前)。

如果没有这个,您的方法GetAllCollaborators可以通过/api/AccountManage/GetAllCollaborators网址访问(根据您的第一个路由模板“DefaultApi”)

答案 1 :(得分:1)

1)您正在尝试使用Attribute Routing ASP.NET Web API 2但不是Enabling Attribute Routing

2)这就是你解决它的方法。

public static class WebApiConfig {

    public static string UrlPrefix { get { return "api"; } }
    public static string UrlPrefixRelative { get { return "~/api"; } }

    public static void Register(HttpConfiguration config) {
         //Enable Web API Attribute routing.
         config.MapHttpAttributeRoutes();

        // Other Web API configuration
        config.Routes.MapHttpRoute(
         name: "DefaultApi",
         routeTemplate: WebApiConfig.UrlPrefix + "/{controller}/{action}/{id}",
         defaults: new { id = RouteParameter.Optional }
        );

        config.Routes.MapHttpRoute(
           name: "DefaultApi2",
           routeTemplate: WebApiConfig.UrlPrefix + "/{controller}" 
        );
    }
}