找到与请求匹配的多个操作 - 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);
}
}
}
中查看更多内容
我的项目中有以下端点
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);
}
}
}
中查看更多内容