Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.NET核心Web API:按方法名称路由?_Asp.net_Asp.net Core_Asp.net Web Api Routing - Fatal编程技术网

ASP.NET核心Web API:按方法名称路由?

ASP.NET核心Web API:按方法名称路由?,asp.net,asp.net-core,asp.net-web-api-routing,Asp.net,Asp.net Core,Asp.net Web Api Routing,我从ASP.NET Web API中记得,在Web API REST方法名称前面加上HTTP命令(例如GetList()=>httpget,Delete()=>httpdelete)就足以使传入呼叫得到适当路由 我还记得,在ASP.NET Web API中,会进行参数匹配,因此即使是Get(int-id)和Get(int-id,string-name)也会自动并适当地进行路由,而不需要任何属性 公共类MyController { 公共操作结果获取(int id)=>。。。 public Acti

我从ASP.NET Web API中记得,在Web API REST方法名称前面加上HTTP命令(例如
GetList()
=>
httpget
Delete()
=>
httpdelete
)就足以使传入呼叫得到适当路由

我还记得,在ASP.NET Web API中,会进行参数匹配,因此即使是
Get(int-id)
Get(int-id,string-name)
也会自动并适当地进行路由,而不需要任何属性

公共类MyController
{
公共操作结果获取(int id)=>。。。
public ActionResult Get(int-id,string-name)=>。。。
public ActionResult DeleteItem(内部id)=>。。。
}

这不是ASP.NET Web API Core中的全部功能吗?

这是Core 2中的功能是的,但我知道如何实现这一功能的方法是这样的

[Route("api/[controller]")]
[ApiController]
public class AvailableRoomsController : ControllerBase
{
    private readonly ApplicationContext _context;

    public AvailableRoomsController(ApplicationContext context)
    {
        _context = context;
    }

    // GET: api/AvailableRooms
    [HttpGet]
    public async Task<ActionResult<IEnumerable<AvailableRoom>>> GetAvailableRooms()
    {
        return await _context.AvailableRooms.ToListAsync();
    }


    // POST: api/AvailableRooms
    [HttpPost]
    public async Task<ActionResult<AvailableRoom>> PostAvailableRoom(AvailableRoom availableRoom)
    {
        _context.AvailableRooms.Add(availableRoom);
        await _context.SaveChangesAsync();

        return CreatedAtAction("GetAvailableRoom", new { id = availableRoom.Id }, availableRoom);
    }

    [HttpPut] .... etc
}
[路由(“api/[控制器]”)]
[ApiController]
公共类可用OMSController:ControllerBase
{
私有只读应用程序上下文\u上下文;
公共可用的eRoom控制器(ApplicationContext上下文)
{
_上下文=上下文;
}
//获取:api/AvailableRooms
[HttpGet]
公共异步任务GetAvailableRooms()
{
返回wait_context.AvailableRooms.ToListSync();
}
//发布:api/AvailableRooms
[HttpPost]
公共异步任务PostAvailableRoom(可用eRoom可用eRoom)
{
_context.availableRoom.Add(availableRoom);
wait_context.SaveChangesAsync();
返回CreateDataAction(“GetAvailableeRoom”,新的{id=AvailableeRoom.id},AvailableeRoom);
}
[HttpPut]……等
}
现在,根据您指定的REST操作类型和发送给“api/AvailableRooms”的模型类型,如果存在正确的操作,将选择该操作


Visual Studio 2019和我认为2017可以自动创建这样的控制器,如果您右键单击控制器文件夹并单击添加->控制器,然后选择“使用实体框架的带操作的API控制器”,并选择一个模型类。

您只需将路由添加到控制器顶部即可

使用api、控制器和操作指定路由:

[Route("api/[controller]/[action]")]
[ApiController]
public class AvailableRoomsController : ControllerBase
{
...
}

我们既不能执行操作重载,也不能将操作名称作为Http谓词前缀。在ASP.NET Core中路由的工作方式与在ASP.NET Web Api中的工作方式不同

但是,您可以简单地组合这些操作,然后在内部进行分支,因为如果您作为querystring发送,则所有参数都是可选的

[HttpGet]
public ActionResult<string> Get(int id, string name)
{
  if(name == null){..}
  else{...}
}
[HttpGet]
public ActionResult Get(int-id,字符串名)
{
如果(name==null){..}
否则{…}
}
或者,如果发送路由数据,则需要使用属性路由来指定每个api:

[HttpGet("{id}")]       
public ActionResult<string> Get(int id)
{
    return "value";
}


[HttpGet("{id}/{name}")]
public ActionResult<string> Get(int id, string name)
{
    return name;
}
[HttpGet(“{id}”)]
公共操作结果获取(int-id)
{
返回“值”;
}
[HttpGet(“{id}/{name}”)]
public ActionResult Get(int-id,字符串名)
{
返回名称;
}

请参阅,

此代码是否完整?我认为您忘记了从
ControllerBase
继承,在同一个控制器中执行多个Get/Post时会出现问题。路由将变得混乱。我应该说路由可能会变得混乱-如果有不同的调用具有相似的参数和方法类型(例如:2个获取采用相同的参数)。这是真的,这种类型的控制器是为CRUD操作设计的,应该处理与模型相关的5个操作之一,这将是Get-Post-Put-Delete和Get-with-ID。我通常将它们与一些数据表框架结合使用,并且有一个用[Route(“API/[action]”)修饰的API控制器,用于更复杂的调用。注意:API是可选的,但似乎是表示API url的一般约定。