使用web api时,如果使用[RoutePrefix()]
假设您有类似“MyReallyLongNamedClassController”的内容。默认路由是http:... com / api / MyReallyLongNamedClass。然后应用程序通过名为Get,Post,Put等的方法(除非当然使用动词装饰器)。
如果我在我的控制器上放置[RoutePrefix("api/LongClass")]
的路由前缀装饰器,我怎么能让web api仍然使用这些方法的默认值?
意思是,我希望名为“GetAll()”的方法仍然映射到“api / LongClass”(当使用get头时)和“PostThis(int id)”仍然映射到“api / LongClass / {id }“(使用帖子标题时)
答案 0 :(得分:5)
这是我为解决问题而做的,而不必用注释来装饰所有方法。我把RoutePrefix放在类级别,以及默认的Route
[RoutePrefix("api/longclass")]
[Route("{id?}")]
public class MyReallyLongNamedClass: ApiController
{
public string GetAll(int id)
{
return "result";
}
public string PostThis([FromBody] MyModel model)
{
var res= _repository.Save(model);
return res;
}
}
答案 1 :(得分:1)
另一种选择:如果你想要做的就是改变路线中的控制器名称,你可以创建一个自定义控制器选择器:
public class CustomControllerSelector : DefaultHttpControllerSelector
{
public CustomControllerSelector(HttpConfiguration configuration)
: base(configuration)
{ }
public override string GetControllerName(HttpRequestMessage request)
{
var name = base.GetControllerName(request);
// Interpret "LongClass" as "MyReallyLongNamedClass"
if (name == "LongClass")
name = "MyReallyLongNamedClass";
return name;
}
}
然后您可以在WebApiConfig.Register
:
config.Services.Replace(typeof(IHttpControllerSelector), new CustomControllerSelector(config));
这样做的好处是您可以使用已映射的路由(使用HttpRouteCollection.MapHttpRoute()
定义)而不是使用属性路由。但是,如果您出于其他原因需要使用属性路由,那么您的解决方案可能会更好。
答案 2 :(得分:0)
您不必担心RoutePrefix属性如何在内部工作。您可以使用RoutePrefix修饰控制器或操作,并可以根据您的设置调用操作。您必须在操作中使用Route
属性才能使[RoutePrefix]
正常工作。
例如,在以下控制器中,对网址GET
的所有api/longclass/get
个请求都会调用GetAll
方法,而POST
的所有api/longclass/post
个请求都会调用PostThis
[RoutePrefix("api/longclass")]
public class MyReallyLongNamedClass: ApiController
{
[Route("get")]
public string GetAll(int id)
{
return "result";
}
[Route("post")]
public string PostThis([FromBody] MyModel model)
{
var res= _repository.Save(model);
return res;
}
}