使用Web API属性路由和RoutePrefix

时间:2015-01-29 16:54:05

标签: routing asp.net-web-api asp.net-web-api-routing

使用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 }“(使用帖子标题时)

3 个答案:

答案 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;
    }
}