Web API Sitecore 8.1 中的属性路由不起作用

Web API Attribute routing in Sitecore 8.1 not working

由于 Atribute 路由在开箱即用的 sitecore 8.1 中不起作用,我正在关注 https://github.com/Krusen/Sitecore.WebApi
并获得了 Krusen.Sitecore.WebApi.Custom.

的 uget 包

这是我的ConfigureWebApiclass

public class ConfigureWebApi
{
    public void Process(PipelineArgs args)
    {

        GlobalConfiguration.Configure(config => config.Routes.MapHttpRoute(
                name: "myApi",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional }
            ));
        GlobalConfiguration.Configure(config => config.MapHttpAttributeRoutes());
        GlobalConfiguration.Configure(ReplaceControllerSelector);
    }

    private static void ReplaceControllerSelector(HttpConfiguration config)
    {
        config.Services.Replace(typeof (IHttpControllerSelector),
            new CustomHttpControllerSelector(config, new NamespaceQualifiedUniqueNameGenerator()));
    }
}

这是我的控制器

[RoutePrefix("windows")]
public class WmsController : ApiController
{
    [HttpGet]
    [Route("hi")]
    public IHttpActionResult Hello()
    {
        return Ok("Welcome to my Api.");
    }

}

当我调用这个时:

http://my.api.local/api/wms/hello

有效。
但是当我打电话给

http://my.api.local/api/windows/hi

不起作用。它说 404.

我是不是漏了什么!!

您需要将 "api/" 添加到您的控制器属性路由中

[RoutePrefix("api/windows")]
public class WmsController : ApiController
{
    [HttpGet]
    [Route("hi")]
    public IHttpActionResult Hello()
    {
        return Ok("Welcome to my Api.");
    }

}

第二次调用失败,因为必须在基于约定的路由之前配置属性路由以避免路由冲突。

public void Process(PipelineArgs args) {
    GlobalConfiguration.Configure(config => {
        // Map Attribute Routes
        config.MapHttpAttributeRoutes();

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

        // Replace IHttpControllerSelector with our custom implementation
        ReplaceControllerSelector(config);
    });
}

我也相信它是如何在链接的 repo 的文档中显示的

其次基于ApiController中的RoutePrefix("window")Route("hi")映射的属性路由将被映射为

http://my.api.local/windows/hi 

要让 http://my.api.local/api/windows/hi 映射到所需的操作,您需要更新路由前缀,如其他答案之一中所述。