ASP.NET Core 过滤器向控制器注入参数 传参

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();
      }
 }
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ASP.NET Core MVC 中,您可以在控制器中使用 `HttpContext` 对象的属性和方法来访问当前请求的信息。`HttpContext` 对象可以通过控制器的 `ControllerContext` 属性来访问。 以下是一些常见的 `HttpContext` 属性和方法: - `HttpContext.Request`:获取当前请求的 HttpRequest 对象,包含请求的 URL、请求方法、请求头、请求正文等信息。 - `HttpContext.Response`:获取当前请求的 HttpResponse 对象,可以通过该对象设置响应的状态码、响应头、响应正文等信息。 - `HttpContext.Session`:获取当前请求的 Session 对象,可以使用它来存储和检索会话数据。 - `HttpContext.User`:获取当前请求的用户信息,可以使用它来进行身份验证和授权。 以下是一个简单的示例,展示如何在控制器中使用 `HttpContext.Request` 对象: ```csharp public class MyController : Controller { public IActionResult Index() { var request = HttpContext.Request; // 使用 request 对象访问请求的信息 return View(); } } ``` 注意,在 ASP.NET Core 中,推荐使用依赖注入来获取 `HttpContext` 对象,而不是直接访问控制器的 `ControllerContext` 属性。例如,您可以在控制器的构造函数中注入 `IHttpContextAccessor` 接口,并使用它来访问 `HttpContext` 对象: ```csharp public class MyController : Controller { private readonly IHttpContextAccessor _httpContextAccessor; public MyController(IHttpContextAccessor httpContextAccessor) { _httpContextAccessor = httpContextAccessor; } public IActionResult Index() { var request = _httpContextAccessor.HttpContext.Request; // 使用 request 对象访问请求的信息 return View(); } } ``` 希望这可以帮助您开始使用 `HttpContext` 对象来访问请求信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值