我正在使用 Swagger UI 在 C# ASP.NET Core Web API 中构建一组方法,并从运行良好的 Login API 方法开始。然后我添加了另一个
GetCategoryData
方法,效果也很好。当我添加第三个 GetCurrentSearch
方法时,现在出现以下错误:
这些方法使用 Jwt 令牌身份验证,并且可以自行正常工作。如果我注释掉
GetCategoryData
,它工作得很好,如果我注释掉 GetCurrentSearch
,也会发生同样的情况,但如果两者都没有注释掉,那么我会收到上述错误。
[HttpPost] //(Name = "Login")]
public string Login(string username, string pwd)
{
// .
// .
}
[HttpGet] //(Name = "GetCategoryData")]
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme, Roles = "Administrator")]
public IEnumerable<CategoryDataModel> GetCategoryData()
{
List<CategoryDataModel> prodData = AdminProductResearchController.LoadProductSearch();
return prodData;
}
[HttpGet] //(Name ="GetCurrentSearch")]
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme, Roles = "Administrator")]
public IEnumerable<CurrentSearchDataModel> GetCurrentSearch()
{
List<CurrentSearchDataModel> currSearchData = AdminCurrentSearchesController.BuildData();
return currSearchData;
}
我错过了什么,导致我无法一起运行所有 API 方法,因为我还有更多要添加的内容,并且无法继续注释掉它们?
在 ASP.NET Core API 中,当添加新的操作方法并配置路由时,我们需要确保每个方法都有唯一的路由或路由模板,因为 ASP.NET Core 使用路由来确定要调用的方法传入的 HTTP 请求。
使用您的代码,在同一个控制器中添加 GetCategoryData 和 GetCurrentSearch 操作方法后,由于它们都使用
[HttpGet]
属性而没有添加额外的属性路由,因此它们的请求路径都是 https://localhost:<port>/api/<Controller>
要解决这个问题,你可以将它们(两个 HttpGet 方法)放在不同的控制器中或设置不同的属性路由,如下所示:
[Route("api/[controller]")]
[ApiController]
public class TodoController : ControllerBase
{
[HttpPost("/Login")] //(Name = "Login")]
public string Login(string username, string pwd)
{
// .
// .
return "Success";
}
//Get /GetCategoryData
[HttpGet("/GetCategoryData")] //(Name = "GetCategoryData")]
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme, Roles = "Administrator")]
public IEnumerable<CategoryDataModel> GetCategoryData()
{
List<CategoryDataModel> prodData = new List<CategoryDataModel>();
prodData.Add(new CategoryDataModel() { ID=1001, Name="A" });
return prodData;
}
//Get api/<Controller>/GetCurrentSearch
[HttpGet("GetCurrentSearch")] //(Name ="GetCurrentSearch")]
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme, Roles = "Administrator")]
public IEnumerable<CurrentSearchDataModel> GetCurrentSearch()
{
List<CurrentSearchDataModel> currSearchData = new List<CurrentSearchDataModel>()
{
new CurrentSearchDataModel(){ ID=1001, Name="A" },
};
return currSearchData;
}
输出如下:
更多详细信息,请参阅路由到 ASP.NET Core 中的控制器操作