我有一只ASP。 Net Core WebAPI 应用程序中,我创建了一个通用的自定义基本控制器类,该类已经为从中继承的任何控制器提供 CRUD 操作(GetAll、GetById、Insert、Update 和 Delete)。
在我的一些控制器中,我必须禁用一些方法。当然,我可以使用 [nonaction] 属性来执行此操作。但我真正想做的是实现一个属性并将其应用到我的控制器上以禁用一系列方法。这可能吗? 我们将不胜感激您的帮助!
这是我的一些代码:
public interface IBaseService<T> where T : DomainObject {
Task<PagedResultViewModel<T>> GetAllAsync(BaseRequestViewModel request);
Task<SingleResultViewModel<T>> GetByIdAsync(int id);
Task<SingleResultViewModel<T>> InsertAsync(T entity);
Task<SingleResultViewModel<T>> UpdateAsync(T entity);
Task<SingleResultViewModel<T>> DeleteAsync(int id);
}
我的自定义基本控制器是这样的:
public class ProcessMiningControllerBase<T> : ControllerBase where T : DomainObject
{
private readonly IBaseService<T> _baseService;
public ProcessMiningControllerBase(IBaseService<T> baseService)
{
_baseService = baseService;
}
[HttpPost]
public virtual async Task<PagedResultViewModel<T>> GetAllAsync(BaseRequestViewModel request)
{
return await _baseService.GetAllAsync(request);
}
[HttpGet("{id}")]
public virtual async Task<SingleResultViewModel<T>> GetByIdAsync(int id)
{
return await _baseService.GetByIdAsync(id);
}
[HttpPost]
public virtual async Task<SingleResultViewModel<T>> InsertAsync(T entity)
{
return await _baseService.InsertAsync(entity);
}
[HttpPut]
public virtual async Task<SingleResultViewModel<T>> UpdateAsync(T entity)
{
return await _baseService.UpdateAsync(entity);
}
[HttpDelete("{id}")]
public virtual async Task<SingleResultViewModel<T>> DeleteAsync(int id)
{
return await _baseService.DeleteAsync(id);
}
}
您可以通过四个步骤禁用控制器及其操作:
1- 创建一个动作过滤器属性,使控制器始终返回 404 NOT Found,如下代码所示:
public class DisableControllerAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.Result = new NotFoundObjectResult(null);
}
}
2- 在应用程序 Program.cs 中注册过滤器,如下所示:
builder.Services.AddControllers((c) => c.Filters.Add<DisableControllerAttribute>());
3- 用您创建的动作过滤器装饰控制器:
[DisableController]
public class ValuesController : ControllerBase
4- 此步骤是可选的。如果你想从 Swagger 页面隐藏控制器,还可以向控制器添加以下属性
[ApiExplorerSettings(IgnoreApi = true)]