领先的免费Web技术教程,涵盖HTML到ASP.NET

网站首页 > 知识剖析 正文

ASP.NET 8 Web API中使用ActionFilter和特性来实现接口幂等

nixiaole 2025-03-28 19:36:51 知识剖析 19 ℃


要在 ASP.NET 8 Web API 中使用 ActionFilter 和特性来实现接口幂等,你可以创建一个自定义ActionFilter 特性并将其应用于你的控制器方法。以下是一个示例,演示如何实现这一点:

首先,

创建一个名为 IdempotentAttribute 的特性类:

using Microsoft.AspNetCore.Mvc.Filters;

using System;

[AttributeUsage(AttributeTargets.Method, Inher

ited = false, AllowMultiple = false)]

public sealed class IdempotentAttribute : Att

ribute, IActionFilter

{

public void OnActionExecuted(ActionExec

utedContext context)

{

// 暂时不需要实现

}

public void OnActionExecuting(ActionExec

utingContext context)

{

// 在此处编写幂等性检查逻辑

if (context.HttpContext.Request.Metho

d == "POST")

{

// 获取请求的数据

var requestData = context.HttpCo

ntext.Request.Form;

// 根据请求数据来检查幂等性,这里简

化为检查是否有一个名为"IdempotentKey"的字段

if (!requestData.ContainsKey("Idem

potentKey"))

{

// 如果没有"IdempotentKey"字

段,表示不是幂等请求,返回冲突状态码

context.Result = new Conflict

ObjectResult("非幂等请求");

}

}

}

}

然后,将 IdempotentAttribute 特性应用于你的控

制器方法:

using Microsoft.AspNetCore.Mvc;

using System;

using System.Collections.Generic;

using System.Linq;

namespace YourWebApi.Controllers

{

[Route("api/products")]

[ApiController]

public class ProductsController : Controll

erBase

{

private readonly List _prod

ucts = new List();

// POST: api/products

[HttpPost]

[ProducesResponseType(201)]

[ProducesResponseType(409)]

[Idempotent] // 应用自定义的 Idempot

ent 特性

public IActionResult CreateProduct([Fr

omBody] Product product)

{

if (product == null)

{

return BadRequest("无效的产

品数据");

}

// 检查是否存在具有相同 ID 的产品

var existingProduct = _products.Fi

rstOrDefault(p => p.Id == product.Id);

if (existingProduct != null)

{

// 如果存在相同 ID 的产品,返回

冲突状态码

return Conflict("具有相同 ID 的

产品已存在");

}

// 创建新产品并将其添加到列表

_products.Add(product);

// 返回创建成功的状态码

return CreatedAtRoute(new { id

=product.Id }, product);

}

}

public class Product

{

public Guid Id { get; set; }

public string Name { get; set; }

public decimal Price { get; set; }

}

}

在上述示例中,我们创建了一个

IdempotentAttribute 特性,并将其应用于CreateProduct 控制器方法上。在

IdempotentAttribute 特性的

OnActionExecuting 方法中,我们检查了请求是否为幂等请求,这里简单地检查是否包含一个名为“IdempotentKey” 的字段。如果不是幂等请求,将返回冲突状态码。如果是幂等请求,则继续执行控制器方法。

这样,你的 API 将只对带有 Idempotent 特性的请求实现幂等性。请根据你的实际需求修改幂等性检查逻辑。

Tags:

最近发表
标签列表