首页 > 解决方案 > 如何解决我在 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;
        }
    }

}

标签: asp.net-web-api

解决方案


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

请记住,调用 API 时,函数名无关紧要。函数名称仅供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

规则是:

每个 Http 操作只能有一个路由名称。


不同的 HTTP 方法

[HttpGet]是具有GET方法的属性之一,但是,还有许多其他方法,例如POSTHEADPUTOPTIONSDELETE、和。CONNECTTRACEPATCH

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

[HttpPost]
[HttoPut]

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

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

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

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

为什么不同的方法

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

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

  • 标头
  • 参数
  • 身体
  • 页脚

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

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

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

  • GET - 你只是在获取数据而不是在正文中发送任何内容
  • POST - 当您在数据库中创建某些内容或在正文中发送数据时
  • PUT - 类似于 Post,但仅在您更新某些内容时
  • 删除 - 当您删除某些东西时。

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


推荐阅读