如何解决我在网络 api 中遇到的错误?

How can I resolve the error I am getting in web api?

**web-api**

如您所见,我必须开发不同的 api。为此,我创建了一个 MasterController。但是我遇到了问题。我正在使用 Postman 进行测试,但遇到了以下问题。请帮我解决这个问题。我得到多个赛点。请帮我解决问题。

Microsoft.AspNetCore.Routing.Matching.AmbiguousMatchException: 请求匹配多个端点。

using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using VENUS.HRMS.API.Filters;
using VENUS.HRMS.DATA.Data;
using VENUS.HRMS.DATA.Models;

namespace VENUS.HRMS.API.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class MasterController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
        [HttpGet]
        [AuthorizationFilter]
        public IEnumerable<TblMstEmpRole> Get()
        {
            var emprole = new EmpRoleData().GetMstEmpRole();

            return emprole;
        }

        [HttpGet]
        [AuthorizationFilter]
        public IEnumerable<TblMstState> GetState()
        {
          var state = new StateData().GetMstState();

            return state;

        }

        [HttpGet]
        [AuthorizationFilter]
        public IEnumerable<TblMstCity> GetCity()
        {
            var city = new CityData().GetMstCity();

            return city;
        }
    }

}

问题正是错误所说:The request matched multiple endpoints

请记住,调用 API 时,函数名称无关紧要。函数名称仅供 "Internal" 在您的 C# 应用程序中使用。 API 端点的名称与其路由相关。此路由使用 [Route()] 属性或 [HttpGet()] 属性设置。

例如你有 3 个函数:

[HttpGet]
public IEnumerable<TblMstEmpRole> Get()

[HttpGet]
public IEnumerable<TblMstState> GetState()

[HttpGet]
public IEnumerable<TblMstCity> GetCity()

这三个函数的完整路由分别是:

Get --> /Master/
Get --> /Master/
Get --> /Master/

是的,你们都是一样的。这就是您遇到的确切问题。要解决此问题,请像这样更改端点的路由:

[HttpGet]
public IEnumerable<TblMstEmpRole> Get()

[HttpGet("State")]
public IEnumerable<TblMstState> GetState()

[HttpGet("City")]
public IEnumerable<TblMstCity> GetCity()

现在路线将如下所示:

Get --> /Master/
Get --> /Master/State
Get --> /Master/City

规则是:

You can only have one route name per Http operation.


不同的 HTTP 方法

[HttpGet] 是具有 GET 方法的属性之一,但是,还有许多其他方法,例如 POSTHEADPUTOPTIONSDELETECONNECTTRACEPATCH.

要通过 API 端点使用它们,您需要做的就是将其添加到函数中。所有属性都具有 [Http***] 格式。例如 Post 和 Put 将是:

[HttpPost]
[HttoPut]

并且上面已经提到了一点,每个方法只能有一个Route。请参阅以下示例:

// PATH: GET --> /Master/
[HttpGet]
public IEnumerable<TblMstEmpRole> GETGet()

// PATH: POST --> /Master/
[HttpPost]
public IEnumerable<TblMstEmpRole> POSTGet()

上面的例子是有效。尽管我们有两个具有相同路由的函数,但它们确实具有不同的 Http 方法,因此是唯一可识别的。

为什么方法不同

每种方法都有自己的特点和用途。根据方法的不同,有些事情是允许的,有些则不允许。当客户端向服务器发出查询并发送某些内容时,这称为 Http Request。获取或设置它的方法是 Http Method,例如 GET、POST、PUT...

一个 Http 请求具有以下结构:

  • Headers
  • 参数
  • Body
  • 页脚

如果我们要使用 GET 方法,那么您是在告诉端点它应该忽略请求的 Body

如果我们使用 HEAD 方法,那么我们就是在告诉端点我们只对请求的 Headers 部分感兴趣。

现在要弄清楚使用哪个以及何时使用可能会很棘手,但作为基本的经验法则,您可以使用以下方法:

  • GET - 您只是获取数据,而不是在 body
  • 中发送任何内容
  • POST - 当您在数据库中创建内容或在 body
  • 中发送数据时
  • PUT - 与 Post 类似,但仅当您更新某些内容时才有效
  • DELETE - 当您删除某些内容时。

这些是任何初学者到中级都应该知道的基本 4 点。有关使用哪种方法的更多信息,请参阅:https://www.w3schools.com/tags/ref_httpmethods.asp