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 包
这是我的ConfigureWebApi
class
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
映射到所需的操作,您需要更新路由前缀,如其他答案之一中所述。
由于 Atribute 路由在开箱即用的 sitecore 8.1 中不起作用,我正在关注 https://github.com/Krusen/Sitecore.WebApi
并获得了 Krusen.Sitecore.WebApi.Custom
.
这是我的ConfigureWebApi
class
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
映射到所需的操作,您需要更新路由前缀,如其他答案之一中所述。