2

我正在使用 Web API 2,它似乎已经调用了我现有的 API 调用,除了它复制了我拥有的每个区域的所有调用。例如,假设我有 3 个区域,其中一个区域有一个 API 调用,如下所示:

public IList<string> GetStringList(string id)
    {
        //do work here...
        return new List<string>{"a","b","c"};
    }

如果我有 3 个区域,那么 web api 帮助页面将显示:

获取 area1/api/MyAPIController/GetStringList/{id}

获取 area2/api/MyAPIController/GetStringList/{id}

获取 area3/api/MyAPIController/GetStringList/{id}

并且 MyAPIController 仅存在于“area2”中。为什么会显示 3 次,我该如何解决?如果有帮助,我对 area2 的区域注册是:

public class Area2AreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get
        {
            return "Area2";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Area2_default",
            "Area2/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional }
        );

        context.Routes.MapHttpRoute(
    name: "Area2_ActionApi",
    routeTemplate: "Area2/api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

    }
}
4

1 回答 1

1

虽然不能解决您的问题,但您可以使用属性来映射操作路线作为临时解决方法。

要启用路由属性,请添加config.MapHttpAttributeRoutes(); 到 WebApiConfig 中的注册,它应该在 App_Start 文件夹中。

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

    // Convention-based routing.
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
}

启用属性路由后,您可以通过操作指定路由:

public class BooksController : ApiController
{
    [Route("api/books")]
    public IEnumerable<Book> GetBooks() { ... }
}

你可以在这里阅读更多。查看路由前缀(如上所示)并确保您启用了带有属性的路由,如页面开头所示。

编辑:

在你的情况下:

[Route("area2/api/MyAPIController/GetStringList/{id}")]
public IList<string> GetStringList(string id)
{
    //do work here...
    return new List<string>{"a","b","c"};
}
于 2015-06-17T14:08:06.250 回答