asp.net-web-api - 如何解决我在 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 时,函数名无关紧要。函数名称仅供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
方法的属性之一,但是,还有许多其他方法,例如POST
、HEAD
、PUT
、OPTIONS
、DELETE
、和。CONNECT
TRACE
PATCH
要通过 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
推荐阅读
- r - Rtools 3.5 not recognized?
- javascript - 为什么lodash有gt、lt、gte、lte函数?
- primavera - Primavera P6 - 存储项目开始/结束日期的位置
- java - 有没有办法限制 .getId()
- mysql - MySQL only_full_group_by error
- wordpress - WordPress 从本地主机迁移到实时服务器后,图像未显示错误
- javascript - 如何从json数据中获取唯一的年份列表?
- python - 在 Python 上运行多个海龟速度
- firebase - SnapShotListener 与 FCM
- javascript - Chart.js 使用 JavaScript 对象