找到与请求匹配的多个操作 - Net Framework 4.6.1

Multiple actions were found that match the request - Net Framework 4.6.1

我的项目中有以下端点

A -> http://localhost:8089/products/
B -> http://localhost:8089/products/{id}

我需要添加以下内容:

C -> http://localhost:8089/products/{id}/track

但是当我 运行 新端点时,我收到以下错误(端点 B 也受到影响):

Multiple actions were found that match the request: 
GetProduct on type ProductsApi.Controllers.ProductsController
GetProductTracking on type ProductsApi.Controllers.ProductsController
   en System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext)
   en System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext controllerContext)
   en System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)
   en System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__15.MoveNext()

我的控制器有:

using System;
using System.Diagnostics;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web.Http;

namespace ProductsApi.Controllers
{
    [Route("controller")]
    [Authorize]
    public class ProductsController : BaseController
    {
        private readonly IProductService _ProductService;

        public ProductsController(IProductService ProductService)
        {
            _ProductService = ProductService;
        }

        [HttpGet]
        public async Task<IHttpActionResult> ListProducts(string startDate = "", string endDate = "", string brand = "")
        {
            ProductFilterRequest filterProductRequest = new ProductFilterRequest(startDate, endDate, brand);
            var result = await _ProductService.ListProducts(filterProductRequest);
            return Ok(result);
        }

        [HttpGet]
        public async Task<IHttpActionResult> GetProduct(int id)
        {
            var result = await _ProductService.GetProductDetail(id);
            return Ok(result);
        }

        [HttpGet()]
        [Route("{id}/track")]
        public async Task<IHttpActionResult> GetProductTracking(int id)
        {
            var result = await _ProductService.GetProductTracking(id);
            return Ok(result);
        }

    }
}

Startup.cs

using Microsoft.Owin;
using System.Web.Http;
using System.Configuration;

[assembly: OwinStartup(typeof(Product.Api.Startup))]
namespace Product.Api
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            ....

            // configure web api
            var config = new HttpConfiguration();
            config.MapHttpAttributeRoutes();           
            app.UseWebApi(config);
        }
    }
}

Global.asax.cs

using Newtonsoft.Json.Serialization;
...
using System.Web.Http;

namespace Product.Api
{
    public class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AutoMapperConfig.Initialize();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            ...
        }
    }
}

WebApiConfig.cs

我已经配置了路由,我尝试在路由模板中进行修改,但没有任何结果。

using System.Web.Http;

namespace Product.Api
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                 name: "DefaultApi",
                 routeTemplate: "{controller}/{id}/{name}",
                 defaults: new
                 { 
                     id = RouteParameter.Optional,
                     name=RouteParameter.Optional
                 }
             );
        }
    }
}

[路线("track/{id}")] 您可以尝试将变量 {id} 放在地址的末尾吗?

试试这个

        [HttpGet("track/{id}")]
        public async Task<IHttpActionResult> GetProductTracking(int id)
        {
            var result = await _ProductService.GetProductTracking(id);
            return Ok(result);
        }

Startup.cs 注释下面的代码,此设置未正确应用

using Microsoft.Owin;
using System.Web.Http;
using System.Configuration;

[assembly: OwinStartup(typeof(Product.Api.Startup))]
namespace Product.Api
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            ....

            // configure web api
            //var config = new HttpConfiguration();
            //config.MapHttpAttributeRoutes();
            //app.UseWebApi(config);
        }
    }
}

WebApiConfig.cs中你需要添加下面一行

config.MapHttpAttributeRoutes();

最后在您的控制器中,您可以使用 [RoutePrefix] 属性为整个控制器设置公共前缀,并为操作添加 [Route] 属性

using System;
using System.Diagnostics;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web.Http;

namespace ProductsApi.Controllers
{
    [RoutePrefix("orders")]
    [Authorize]
    public class ProductsController : BaseController
    {
        private readonly IProductService _ProductService;

        public ProductsController(IProductService ProductService)
        {
            _ProductService = ProductService;
        }
        public OrdersController()
        {            
        }

        [HttpGet]
        public async Task<IHttpActionResult> ListProducts(string startDate = "", string endDate = "", string brand = "")
        {
            ProductFilterRequest filterProductRequest = new ProductFilterRequest(startDate, endDate, brand);
            var result = await _ProductService.ListProducts(filterProductRequest);
            return Ok(result);
        }

        [HttpGet]
        public async Task<IHttpActionResult> GetProduct(int id)
        {
            var result = await _ProductService.GetProductDetail(id);
            return Ok(result);
        }

        [HttpGet()]
        [Route("{id}/track")]
        public async Task<IHttpActionResult> GetProductTracking(int id)
        {
            var result = await _ProductService.GetProductTracking(id);
            return Ok(result);
        }

    }
}

https://docs.microsoft.com/en-us/aspnet/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

中查看更多内容