ASP.NET Core 过滤器向控制器注入参数(传参)
场景
如题,在ASP.NET Core使用过程中,过滤器处理相关业务后,有时需要统一初始化一些数据,并将数据传递到控制器和API中。
方法一 ModelStateDictionary
优点:实现简单
缺点:只能传字符串参数,相较于方法二,功能单一
1、写入参数
public class SignFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
//...
context.ModelState.SetModelValue("Key1",new Microsoft.AspNetCore.Mvc.ModelBinding.ValueProviderResult("Value"));
base.OnActionExecuting(context);
}
}
2、获取参数
[HttpPost("search")]
public async Task<IActionResult> Gets([FromBody] MachineSearch searchView)
{
var modelStateEntry = ModelState["key1"];
if(modelStateEntry != null)
Console.WriteLine(Request.Path+ ":api-ModelStateDictionary:"+ modelStateEntry.AttemptedValue);
}
方法二 自定义IHttpContextAccessor
优点:可以传自定义对象参数
缺点:相较于较ModelStateDictionary,实现复杂些
1、实现IHttpContextAccessor
public class HttpContextAccessorUOM: HttpContextAccessor
{
public string SomeString { get; set; }
}
2、传参
public class SignFilter : ActionFilterAttribute
{
private IHttpContextAccessor _httpContextAccessor;
public SignFilter(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public override void OnActionExecuting(ActionExecutingContext context)
{
var val = System.Guid.NewGuid().ToString();
((HttpContextAccessorUOM)_httpContextAccessor).SomeString = val;
base.OnActionExecuting(context);
}
}
3、注册
在Startup
中注册
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IHttpContextAccessor, HttpContextAccessorUOM>();
}
}
4、获得参数
[Route("api/machine")]
public class MachineController : Controller
{
public readonly IHttpContextAccessor _httpContextAccessor;
public BaseController(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
[HttpPost("search")]
public async Task<IActionResult> Gets([FromBody] MachineSearch searchView)
{
var httpContextAccessorTemp = (Filters.HttpContextAccessorUOM)_httpContextAccessor;
if (httpContextAccessorTemp != null)
System.Console.WriteLine(Request.Path.Value + ":api-HttpContextAccessor:" + httpContextAccessorTemp.SomeString);
return Ok();
}
}