Cav*_*man 1 c# dependency-injection nlog .net-core asp.net-core-webapi
我仍然没有\xe2\x80\x99t 依赖注入,并且我\xe2\x80\x99m 是新的.Net Core(使用3.1.5)。我\xe2\x80\x99已经为WebAPI创建了一个AuthorizationFilter。我\xe2\x80\x99m 仍然不明白的是如何将我的 Nlog 传递给属性。
\n我有以下内容作为我的 AuthorizaitonFilter
\npublic class TokenAttribute : Attribute, IAuthorizationFilter\n {\n private readonly ILogger _logger;\n\n public TokenAttribute(ILogger logger)\n {\n _logger = logger;\n }\n\n public void OnAuthorization(AuthorizationFilterContext context)\n {\n _logger.LogInformation("Authorizing");\n\n //Get the values from the Request Header\n context.HttpContext.Request.Headers.TryGetValue("Api-Token", out var token);\n context.HttpContext.Request.Headers.TryGetValue("Customer", out var customer);\n\n //Query to look up Customer and Token\n\n using (var ctx = new ModelContext())\n {\n var results = ctx.Token.FromSqlRaw(sbQuery.ToString()).ToList();\n\n if (results == null || results.Count == 0)\n {\n context.Result = new BadRequestObjectResult("Invalid Token");\n return;\n }\n\n return; \n }\n } \n } \n}\nRun Code Online (Sandbox Code Playgroud)\n但是,我\xe2\x80\x99m 在我的令牌属性上收到错误。如果我保留它,[Token]我会抱怨一条消息:\xe2\x80\x9cThere is no argument given that corresponds to the required formal parameter\xe2\x80\x9d。我明白这一点是因为 Token attribute\xe2\x80\x99s 构造函数正在寻找 ILogger。
[Token]\n [AcceptVerbs(WebRequestMethods.Http.Get, WebRequestMethods.Http.Post)]\n public ShiftRequest Post([FromBody] ShiftRequest m)\n {\n _logger.LogInformation("Calling POST command.");\nRun Code Online (Sandbox Code Playgroud)\n然后,如果我尝试将 _logger 传递给令牌属性,它会抱怨\xe2\x80\x9cAn object reference is required for the non-static field \xe2\x80\x98ShiftController._logger\xe2\x80\x99\xe2\x80\x9d.
[ApiController]\n[Route("[controller]")]\npublic class ShiftController : ControllerBase\n{\n private IConfiguration _config;\n private readonly ILogger<ShiftController> _logger;\n\n public ShiftController(ILogger<ShiftController> logger, IConfiguration config)\n {\n _config = config;\n _logger = logger;\n }\n \n [Token(_logger)]\n [AcceptVerbs(WebRequestMethods.Http.Get, WebRequestMethods.Http.Post)]\n public ShiftRequest Post([FromBody] ShiftRequest m)\n {\n _logger.LogInformation("Calling POST command.");\nRun Code Online (Sandbox Code Playgroud)\n更新的代码
\npublic class TokenAuthorizationFilter : IAuthorizationFilter\n {\n private readonly ILogger<TokenAuthorizationFilter> _logger;\n public TokenAuthorizationFilter(ILogger<TokenAuthorizationFilter> logger)\n {\n _logger = logger;\n }\n\n public void OnAuthorization(AuthorizationFilterContext context)\n {\n _logger.LogInformation("Authorizing Token");\n\n //Get the values from the Request Header\n context.HttpContext.Request.Headers.TryGetValue("Api-Token", out var token);\n context.HttpContext.Request.Headers.TryGetValue("Customer", out var customer);\n\n\n//Query to check username and password\n\n using (var ctx = new ModelContext())\n {\n var results = ctx.Token.FromSqlRaw(sbQuery.ToString()).ToList();\n\n if (results == null || results.Count == 0)\n {\n context.Result = new BadRequestObjectResult("Invalid Token");\n return;\n }\n\n if (!context.ModelState.IsValid)\n {\n context.Result = new BadRequestObjectResult(context.ModelState);\n }\n\n return;\n }\n }\nRun Code Online (Sandbox Code Playgroud)\n启动.cs
\npublic void ConfigureServices(IServiceCollection services)\n {\n services.AddScoped<TokenAuthorizationFilter>();\n services.AddControllersWithViews();\n }\nRun Code Online (Sandbox Code Playgroud)\n控制器
\n [ServiceFilter(typeof(TokenAuthorizationFilter))]\n [AcceptVerbs(WebRequestMethods.Http.Get, WebRequestMethods.Http.Post)]\n public ShiftRequest Post([FromBody] ShiftRequest m)\n {\n _logger.LogInformation("Calling POST command.");\nRun Code Online (Sandbox Code Playgroud)\n
在这种情况下,您不需要子类化Attribute。[ServiceFilter(type)]对于授权过滤器,可以通过操作的属性添加这些过滤器。ServiceFilter使用该属性时,所有依赖项都会通过 ASP.NET Core 的内置服务提供程序自动注入。
在您的代码中,这看起来像[ServiceFilter(typeof(TokenAttribute))],尽管作为个人建议,将其命名为 类似 可能更合适TokenAuthorizationFilter。
请注意,您必须在HTTP 管道设置TokenAttribute内部或任何地方将您的服务注册为服务。Startup.cs
| 归档时间: |
|
| 查看次数: |
1308 次 |
| 最近记录: |