爱吃大洋芋 發表於 2026-4-24 21:46:00

.NET Web API、路由、模型验证、过滤器、全局异常

<div dir="ltr">
<h2>一、.NET Web API 是什么</h2>
<div>&nbsp;</div>
<div>ASP.NET Web API 是微软用于构建 HTTP 服务 的框架,专门用来开发:</div>
<div>&nbsp;</div>
<ul>
<li>前后端分离接口</li>
<li>移动端 API</li>
<li>微服务接口</li>
</ul>
<div>&nbsp;</div>
<div>它基于 Controller + Action 模式,返回 JSON/XML 数据,不返回页面。</div>
<div>&nbsp;</div>
<hr>
<div>&nbsp;</div>
<h2>二、路由(Routing)</h2>
<div>&nbsp;</div>
<div>路由的作用:把 URL 映射到控制器的方法</div>
<div>&nbsp;</div>
<h3>1. 两种路由方式</h3>
<div>&nbsp;</div>
<h4>(1)特性路由</h4>
<div>&nbsp;</div>
<div>直接在控制器 / 方法上写 <code></code> 定义 URL</div>
<div>&nbsp;</div>
<div>
<div dir="ltr">
<div>
<pre><code>")]

public class UserController : ControllerBase
{
    // GET api/user
   
    public IActionResult GetAll() { ... }

    // GET api/user/10
   
    public IActionResult GetById(int id) { ... }

    // POST api/user
   
    public IActionResult Add( User user) { ... }
}
</code></pre>
</div>
<div>&nbsp;</div>
</div>
</div>
<h4>(2)传统路由(少用)</h4>
<div>&nbsp;</div>
<div>在 <code>Program.cs</code> 统一配置</div>
<div>&nbsp;</div>
<div>
<div dir="ltr">
<div>
<pre><code>app.MapControllerRoute(
    name: "default",
    pattern: "api/{controller}/{action}/{id?}");
</code></pre>
</div>
<div>&nbsp;</div>
</div>
</div>
<h3>2. 路由常用特性</h3>
<div>&nbsp;</div>
<ul>
<li><code></code> / <code></code> / <code></code> / <code></code></li>
<li><code></code> 自定义路由</li>
<li><code></code> 从请求体取数据</li>
<li><code></code> 从 URL 参数取数据</li>
<li><code></code> 从路由取数据</li>
</ul>
<div>&nbsp;</div>
<hr>
<div>&nbsp;</div>
<h2>三、模型验证(Model Validation)</h2>
<div>&nbsp;</div>
<div>模型验证 = 自动校验前端传入的参数是否合法</div>
<div>&nbsp;</div>
<h3>1. 给模型加数据注解</h3>
<div>&nbsp;</div>
<div>
<div dir="ltr">
<div>
<pre><code>public class User
{
   
   
    public string Name { get; set; }

   
    public int Age { get; set; }

   
    public string Email { get; set; }
}
</code></pre>
</div>
<div>&nbsp;</div>
</div>
</div>
<h3>2. 常用验证特性</h3>
<div>&nbsp;</div>
<ul>
<li><code></code> 必填</li>
<li><code></code> 字符串长度</li>
<li><code></code> 数值范围</li>
<li><code></code> 邮箱</li>
<li><code></code> 手机号</li>
<li><code></code> 正则</li>
</ul>
<div>&nbsp;</div>
<h3>3. API 中自动验证</h3>
<div>&nbsp;</div>
<div><code></code> 特性会自动触发模型验证,验证失败自动返回 400,无需手动判断。</div>
<div>&nbsp;</div>
<div>返回格式示例:</div>
<div>&nbsp;</div>
<div>
<div dir="ltr">
<div>
<div>json</div>
<div>&nbsp;</div>
</div>
<div>
<pre><code>{
"errors": {
    "Name": ["姓名不能为空"],
    "Age": ["年龄必须在18-60之间"]
},
"title": "One or more validation errors occurred.",
"status": 400
}
</code></pre>
</div>
<div>&nbsp;</div>
</div>
</div>
<hr>
<div>&nbsp;</div>
<h2>四、过滤器(Filters)</h2>
<div>&nbsp;</div>
<div>过滤器 = 在 Action 执行前后插入逻辑,实现横切关注点(日志、授权、缓存等)</div>
<div>&nbsp;</div>
<h3>1. 5 种过滤器</h3>
<div>&nbsp;</div>
<ol>
<li>Authorization Filter 授权过滤器(最先执行)</li>
<li>Resource Filter 资源过滤器</li>
<li>Action Filter 方法过滤器(最常用)</li>
<li>Exception Filter 异常过滤器</li>
<li>Result Filter 结果过滤器</li>
</ol>
<div>&nbsp;</div>
<h3>2. 自定义 Action 过滤器(示例)</h3>
<div>&nbsp;</div>
<div>
<div dir="ltr">
<div>
<pre><code>public class LogFilter : IActionFilter
{
    // 方法执行前
    public void OnActionExecuting(ActionExecutingContext context)
    {
      Console.WriteLine("API 调用前:" + context.HttpContext.Request.Path);
    }

    // 方法执行后
    public void OnActionExecuted(ActionExecutedContext context)
    {
      Console.WriteLine("API 调用完成");
    }
}
</code></pre>
</div>
<div>&nbsp;</div>
</div>
</div>
<h3>3. 注册使用</h3>
<div>&nbsp;</div>
<div>
<div dir="ltr">
<div>
<pre><code>// 全局注册(所有接口生效)
builder.Services.AddControllers(options =&gt;
{
    options.Filters.Add&lt;LogFilter&gt;();
});

// 或控制器/方法单独使用

public IActionResult Test() { ... }
</code></pre>
</div>
<div>&nbsp;</div>
</div>
</div>
<hr>
<div>&nbsp;</div>
<h2>五、全局异常处理(Global Exception)</h2>
<div>&nbsp;</div>
<div>作用:统一捕获所有接口的异常,返回规范错误信息,不暴露敏感堆栈</div>
<div>&nbsp;</div>
<h3>1. 自定义全局异常过滤器</h3>
<div>&nbsp;</div>
<div>
<div dir="ltr">
<div>
<pre><code>public class GlobalExceptionFilter : IExceptionFilter
{
    public void OnException(ExceptionContext context)
    {
      var exception = context.Exception;

      // 统一返回格式
      var result = new
      {
            code = 500,
            message = "服务器异常:" + exception.Message,
            path = context.HttpContext.Request.Path
      };

      context.Result = new JsonResult(result)
      {
            StatusCode = 500
      };

      // 标记异常已处理
      context.ExceptionHandled = true;
    }
}
</code></pre>
</div>
<div>&nbsp;</div>
</div>
</div>
<h3>2. 注册全局生效</h3>
<div>&nbsp;</div>
<div>
<div dir="ltr">
<div>
<pre><code>builder.Services.AddControllers(options =&gt;
{
    options.Filters.Add&lt;GlobalExceptionFilter&gt;();
});
</code></pre>
</div>
<div>&nbsp;</div>
</div>
</div>
<h3>3. 效果</h3>
<div>&nbsp;</div>
<div>任何接口报错都会返回:</div>
<div>&nbsp;</div>
<div>
<div dir="ltr">
<div>
<div>json</div>
<div>&nbsp;</div>
</div>
<div>
<pre><code>{
"code": 500,
"message": "服务器异常:尝试除以零",
"path": "/api/user"
}
</code></pre>
</div>
<div>&nbsp;</div>
</div>
</div>
<hr>
<div>&nbsp;</div>
<h1>总结</h1>
<div>&nbsp;</div>
<ol>
<li>Web API:构建 HTTP 接口,返回数据</li>
<li>路由:URL 映射到方法,特性路由最常用</li>
<li>模型验证:自动校验参数,<code></code> 自动处理</li>
<li>过滤器:在接口执行前后插入逻辑(日志、授权)</li>
<li>全局异常:统一捕获错误,返回规范错误信息</li>
</ol></div><br><br>
来源:https://www.cnblogs.com/chuansheng/p/19913479
頁: [1]
查看完整版本: .NET Web API、路由、模型验证、过滤器、全局异常