Web Api Get:找到多个与请求匹配的操作
本文关键字:请求 操作 Get Api Web | 更新日期: 2023-09-27 18:28:53
我对以下方法有问题:
[Authorize]
[HttpGet]
[ResponseType(typeof(IEnumerable<Index.Model>))]
public async Task<IHttpActionResult> GetArchives()
[Authorize]
[HttpGet]
[ResponseType(typeof(Get.Query))]
public async Task<IHttpActionResult> GetArchive(Get.Query query)
它给了我以下错误:
<Error>
<Message>An error has occurred.</Message>
<ExceptionMessage>
Multiple actions were found that match the request: GetArchives on type IAP.api.Controllers.ArchivesController GetArchive on type IAP.api.Controllers.ArchivesController
</ExceptionMessage>
<ExceptionType>System.InvalidOperationException</ExceptionType>
<StackTrace>
at System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext) at System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext controllerContext) at System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken) at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()
</StackTrace>
</Error>
我已经阅读了针对提出相同问题的人的其他解决方案,但对我来说并不奏效(更具体地说,这一个)。我正在寻找一个不需要更改WebApi默认REST路由的解决方案,因为我也必须在客户端中更改它。
谢谢,
这实际上是相同路由的问题。您可以尝试使用Route
属性来更改其中一种方法的路由,但不能更改整个路由方案。使用这些属性,您可以尝试不更改路由名称(GetArchives),而是对第二种方法使用额外的路由约束。然后它会是这样的:
/archives/GetArchives
/archives/GetArchives/GetQueryConstraint
为了实现这一点,将[Route("{query}")]
放在第二种方法上。如果这是你的自定义对象,那么你需要创建你的自定义约束并指定它
[Route("{query:constraintType}")]
您可以在操作方法之上使用[ActionName]属性来指定一些不同的名称
[ActionName("archives")]
[ActionName("archive")]
现在,您可以从客户端通过其操作名称进行调用。阅读此处了解更多信息:http://www.codeguru.com/csharp/.net/using-custom-action-names-in-asp.net-web-api.htm