繁体   English   中英

ASP.Net Web API RoutePrefix被部分忽略

[英]ASP.Net Web API RoutePrefix partially ignored

我正在尝试使用RoutePrefix,但是ASP.NET却部分忽略了它。 给定以下控制器(方法主体和类字段已删除):

[RoutePrefix("api/users/sharepoint")]
public class SharePointController : ApiController
{


    public SharePointController(ISharePointUserRepository repo, IAzureUserRepository otherRepo)
    {

    }

    [HttpGet]
    public ExternalUser Get(int id)
    {

    }

    [HttpGet]
    public ExternalUser Get(Guid guid)
    {

    }

    [HttpGet]
    public IEnumerable<ExternalUser> Get()
    {

    }

    [HttpGet]
    public ExternalUser Get(string username)
    {

    }

    [HttpGet]
    public IEnumerable<ExternalUser> GetByPersonalEmail(string email)
    {

    }

    [HttpGet]
    [Route("GetWithDifferences")]
    public IEnumerable<ExternalUser> GetWithDifferences()
    {

    }

    [HttpGet]
    [Route("GetUnique")]
    public IEnumerable<ExternalUser> GetUnique()
    {


    }

    [HttpPost]
    [Route("search")]
    public IEnumerable<ExternalUser> Search([FromBody] ExternalUserSearchModel model)
    {

    }

我得到以下API(通过主机/帮助):

的SharePoint

GET API /用户/共享点/ GetWithDifferences
GET api /用户/ sharepoint / GetUnique
POST api /用户/共享点/搜索
GET api / SharePoint / {id}
GET api / SharePoint?guid = {guid}
GET API / SharePoint
GET api / SharePoint?username = {username}
GET api / SharePoint?email = {email}

经测试,可按广告方式工作。

如您所见,当我没有为公开方法指定[Route(..)]时,RoutePrefix将被忽略。 但是,我希望对GET执行默认操作,因此我不想为此指定任何其他路由。

如何执行RoutePrefix,或者如何使用[Route(..)]维护默认的GET和POST行为?

RoutePrefixAttribute不会定义任何路由,它只会将所选前缀添加到用此类属性修饰的类中定义的任何路由。

然后,您需要做出选择:仅使用属性路由(并为每个方法定义一个路由),以便您可以从RoutePrefix受益,或者将代码保持原样,并定义另一个符合URI的约定路由。

使用属性路由的示例:

[HttpGet]
[Route("{id:int}"]
public ExternalUser Get(int id)
{ }

[HttpGet]
[Route(""]
public ExternalUser Get(Guid guid)
{ }

[HttpGet]
[Route("")]
public IEnumerable<ExternalUser> Get()
{ }

[HttpGet]
[Route("")]
public ExternalUser Get(string username)
{ }

这是第二种方法的另一个示例:

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

    config.Routes.MapHttpRoute(
        name: "MyCustomApi",
        routeTemplate: "api/users/sharepoint/{id}",
        defaults: new { controller = "SharePoint", id = RouteParameter.Optional }
    );

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM