![](/img/trans.png)
[英]Route and RoutePrefix issue within asp.net web api application
[英]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.