添加其他 API 方法时如何防止获取错误?

问题描述 投票:0回答:1

我正在使用 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 方法,因为我还有更多要添加的内容,并且无法继续注释掉它们?

c# asp.net-core-webapi swagger-ui visual-studio-2022
1个回答
0
投票

在 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 中的控制器操作

© www.soinside.com 2019 - 2024. All rights reserved.