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路由的解决方案,因为我也必须在客户端中更改它。

谢谢,

Web Api Get:找到多个与请求匹配的操作

这实际上是相同路由的问题。您可以尝试使用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