ZetCode

ASP.NET AcceptVerbs

最后修改于 2025 年 4 月 3 日

在本文中,我们将探讨 ASP.NET 8 中的 AcceptVerbs 属性。此属性为控制器操作提供了灵活的 HTTP 方法路由。

ASP.NET 是一个用于构建现代 Web 应用程序的跨平台框架。AcceptVerbs 允许将多个 HTTP 方法映射到单个操作。

基本定义

ASP.NET 中的 AcceptVerbs 属性指定哪些 HTTP 方法可以调用特定的操作方法。它比单独的方法属性更灵活。

与 HttpGet 或 HttpPost 不同,AcceptVerbs 可以接受多个 HTTP 方法作为参数。这使其对于处理多种动词类型的操作很有用。

AcceptVerbs 是 ASP.NET 路由系统的一部分。它可与约定路由和属性路由一起使用。该属性可以应用于控制器操作方法。

ASP.NET AcceptVerbs 示例

以下示例演示了使用 AcceptVerbs 的 Web API 控制器。

Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();

var app = builder.Build();

app.MapControllers();
app.Run();

这设置了一个基本的 ASP.NET 应用程序,并支持控制器。MapControllers 方法为控制器启用属性路由。

Controllers/TasksController.cs
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/[controller]")]
public class TasksController : ControllerBase
{
    private static List<TaskItem> _tasks = new()
    {
        new TaskItem(1, "Buy groceries", false),
        new TaskItem(2, "Finish report", true),
        new TaskItem(3, "Call client", false)
    };

    [AcceptVerbs("GET", "HEAD")]
    public IActionResult GetAllTasks()
    {
        return Ok(_tasks);
    }

    [AcceptVerbs("GET", "HEAD", Route = "{id}")]
    public IActionResult GetTaskById(int id)
    {
        var task = _tasks.FirstOrDefault(t => t.Id == id);
        if (task == null) return NotFound();
        return Ok(task);
    }

    [AcceptVerbs("POST", "PUT")]
    public IActionResult CreateOrUpdateTask([FromBody] TaskItem task)
    {
        if (task.Id == 0) // New task
        {
            task.Id = _tasks.Max(t => t.Id) + 1;
            _tasks.Add(task);
            return CreatedAtAction(nameof(GetTaskById), 
                new { id = task.Id }, task);
        }
        
        var existing = _tasks.FirstOrDefault(t => t.Id == task.Id);
        if (existing == null) return NotFound();
        
        existing.Title = task.Title;
        existing.IsComplete = task.IsComplete;
        return NoContent();
    }

    [AcceptVerbs("DELETE", Route = "{id}")]
    public IActionResult DeleteTask(int id)
    {
        var task = _tasks.FirstOrDefault(t => t.Id == id);
        if (task == null) return NotFound();
        
        _tasks.Remove(task);
        return NoContent();
    }
}

public record TaskItem(int Id, string Title, bool IsComplete);

此控制器演示了四种不同的 AcceptVerbs 场景。第一个方法响应 GET 和 HEAD 请求以检索所有任务。

第二个方法也处理 GET 和 HEAD 请求,但针对单个任务。第三种方法结合了 POST 和 PUT 以进行创建/更新操作。

第四种方法使用 DELETE 来删除任务。每种方法根据操作结果返回适当的 HTTP 状态码。

该示例展示了 AcceptVerbs 如何将多个 HTTP 方法合并到单个操作方法中。这减少了代码重复,同时保持了清晰性。

来源

Microsoft ASP.NET 路由文档

在本文中,我们探讨了 ASP.NET 8 中的 AcceptVerbs 属性。此多功能功能为控制器操作提供了灵活的 HTTP 方法路由。

作者

我叫 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出所有 ASP.NET 教程