如何解决我在网络 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
方法的属性之一,但是,还有许多其他方法,例如 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()
上面的例子是有效。尽管我们有两个具有相同路由的函数,但它们确实具有不同的 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
**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
方法的属性之一,但是,还有许多其他方法,例如 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()
上面的例子是有效。尽管我们有两个具有相同路由的函数,但它们确实具有不同的 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