问题标签 [asp.net-mvc-filters]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1419 浏览

c# - 如何在动作过滤器中使用参数验证对 MVC 控制器进行单元测试?

我们有一个 MVC.NET Core Web API 应用程序,它使用操作过滤器来验证控制器方法的参数。

对于验证,我们使用 FluentValidation 框架。在动作过滤器中,我们找到控制器动作的参数在IValidator<TModel>哪里,例如:TModel

在过滤器中OnActionExecuting(ActionExecutingContext context),我们找到正确的验证器 ( IValidator<TModel>),验证参数 ( context.ActionArguments),如果验证失败,我们通过将验证结果分配给 - 进行短路,context.Result这意味着执行永远不会到达控制器。

基本原理类似于将 FluentValidation 连接到 MVC 的 ModelState 验证管道中,但我们需要一些额外的东西,所以我们手动进行。

我们想对控制器和验证器进行单元测试。问题在于对控制器进行单元测试。在测试设置中,我们实例化控制器并调用其方法之一。现在在生产环境中,参数将始终得到验证,并且只有在参数有效时才会真正进入控制器方法。但是当对控制器进行单元测试时,我们很容易传递无效的参数并得到意外的行为。

原则上,有没有办法解决这个问题?或者我是否真的需要确保在测试方法中我将有效参数传递给控制器​​?

编辑:

我们还计划进行集成测试(很可能使用 .NET Core 的 TestServer)以确保管道正常工作。在这篇文章中,我只想讨论从单元测试方法传递到控制器的无效参数的问题。

0 投票
1 回答
43 浏览

c# - 在 OnActionExecuting 的覆盖方法中读取 contex.Result() 的状态

我正在重写 OnActionExecuting 方法,以便在调用某些控制器的方法之前执行一些检查,我想知道是否有任何方法可以读取 context.Result() 值来检查它是否等于 - 例如 - 状态 401 未授权或类似,为了在不同的状态下执行不同的动作,像这样......

有没有办法读取context.Result()值/状态以便在 if() 语句中使用它?

0 投票
1 回答
121 浏览

c# - 从 OnActionExecuting 访问方法的属性

我想知道如何检查控制器方法是否具有某个属性,例如AllowAnonymous,在OnActionExecuting覆盖方法中。

我试过这个:

但我总是得到一个空值。

也试过这个:

但是当没有 AuthorizeAttribute 我得到一个超出范围的异常。

我该怎么做这个检查?

0 投票
1 回答
1047 浏览

asp.net-mvc - 在操作过滤器中记录响应主体

IAsyncActionFilter我在使用 .Net Core实现的类中有以下代码。

这一行:

产生以下错误

失败:Microsoft.AspNetCore.Server.Kestrel[13]

连接 ID“0HLFBE2K7NSD3”,请求 ID“0HLFBE2K7NSD3:00000001”:应用程序引发了未处理的异常。System.ArgumentException:流不可读。在 System.IO.StreamReader..ctor(Stream stream, Encoding encoding, Boolean detectEncodingFromByteOrderMarks, Int32 bufferSize, Boolean leaveOpen) 在 System.IO.StreamReader..ctor(Stream stream) 在 Adapter.Logging.Middleware.LogResponseFilter.d__2.MoveNext () 在 C:\src\Adapter\Logging\Middleware\LogRequestResponseFilter.cs:line 56

--- 从先前引发异常的位置结束堆栈跟踪 --- 在 Microsoft.AspNetCore.Mvc 的 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 的 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()。 Internal.ControllerActionInvoker.d__10.MoveNext()

--- 从先前引发异常的位置结束堆栈跟踪 --- 在 Microsoft.AspNetCore 的 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext context) 的 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()。 Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) 在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.d__14.MoveNext()

--- 从先前引发异常的位置结束堆栈跟踪 --- 在 Microsoft.AspNetCore.Mvc 的 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 的 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()。 Internal.ResourceInvoker.d__22.MoveNext()

--- 从先前引发异常的位置结束堆栈跟踪 --- 在 Microsoft.AspNetCore 的 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context) 的 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()。 Mvc.Internal.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__17.MoveNext()

--- 从先前引发异常的位置结束堆栈跟踪 --- 在 Microsoft.AspNetCore.Mvc 的 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 的 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()。 Internal.ResourceInvoker.d__15.MoveNext()

--- 从先前引发异常的位置结束堆栈跟踪 --- 在 Microsoft.AspNetCore.Builder 的 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 的 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()。 RouterMiddleware.d__4.MoveNext()

--- 从先前引发异常的位置结束堆栈跟踪 --- 在 Microsoft.AspNetCore.Cors 的 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 的 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()。 Infrastructure.CorsMiddleware.d__7.MoveNext() --- 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task任务)在 Microsoft.AspNetCore.Hosting.Internal.RequestServicesContainerMiddleware.d__3.MoveNext() --- 从先前引发异常的位置结束堆栈跟踪---在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.运行。Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Frame`1.d__2.MoveNext() 上的 CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)

我的问题是:

为了安全地重置响应流,我需要做什么?

我有另一个用于记录的 IAsyncActionFilter 实现:

0 投票
0 回答
78 浏览

exception-handling - 在 HandleErrorAttribute 中重定向不起作用

如果出现特定异常,我想重定向用户。

为此,我编写了自定义异常过滤器,它可以工作,这意味着如果我放置一个断点,它会正确通过它,但我无法覆盖异常的正常行为并将用户移动到自定义页面。

异常模拟:

过滤器重定向:

浏览器中的结果(也没有调试):

“/”应用程序中的服务器错误。

值不能为 null 或空。

0 投票
1 回答
4042 浏览

c# - 使用过滤器属性验证模型

出于 DRY 的原因,我正在练习属性验证,但我得到了一些 Web Api 的示例,我不知道是否有办法返回带有无效数据和模型状态错误的视图,而不是 API 中使用的 BadRequestObjectResult。

我已经阅读了有关它的官方文档,但我不明白在视图的情况下它是如何实现的。

我正在使用具有 2 个输入的基本模型在 EF Core Entity 中添加数据来测试此属性过滤器。我的目标是为这种情况获得一些通用的东西,因为我对 Web Api 理解它。

提前感谢您能给我的任何帮助。

我想在 IActionResult 中更改它:

类似于这个属性类:

这是示例的实际响应(但我想使用 MVC 页面返回错误和模型数据):

0 投票
1 回答
259 浏览

asp.net-mvc - aspnetcore 多个全局异常过滤器问题

我读了这个https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/filters?view=aspnetcore-3.1#filter-scopes-and-order-of-execution,它似乎表明异常过滤器的执行方式没有明确的顺序(因为它们的范围相同)。

我有 3 个异常过滤器:1 个是通用的第 3 方异常过滤器,2 个是特定的异常过滤器。

我怎样才能做到这一点,以便当我的过滤器处理特定异常时,通用异常不再处理它?

0 投票
1 回答
697 浏览

c# - 如果我在 ASP.NET Core 应用程序中制作过滤器,我是否也应该继承 IFilterMetadata?

我已经做了一个授权过滤器(通过继承 new IAsyncAuthorizationFilter),我也应该继承IFilterMetadata,为什么/为什么不?

谢谢你。

0 投票
2 回答
523 浏览

c# - 在 MVC C# 中将对象传递给 ActionFilter 构造函数

我正在尝试在我的 MVC 应用程序中创建自定义日志过滤器。以下是我的代码

在上面的代码中,我试图将服务实例传递给我的过滤器属性。如何实现将实例传递给我的自定义过滤器属性?

0 投票
1 回答
253 浏览

c# - 如何以编程方式在 startup.cs 中检索与 services.AddControllers 一起使用的 AspNetCore Mvc 过滤器列表(FilterCollection 的类型)?

我有一个授权过滤器可应用于所有控制器的操作,以保护应用程序的端点(例如CustomAuthorizationFilter : IResourceFilter, IFilterMetadata

可以startup.cs像这样添加此自定义过滤器:

对于我的用例,我想确保 100% 使用此过滤器保护所有 API(及其控制器),换句话说,我想确保其类中的MyApp.API.Server .csproj项目引用.startup.csCustomAuthorizationFilter

我开始做的是创建一个SecurityAttributeReaderMyApp.API.Server 来解析项目配置并检查此过滤器是否存在:

我的问题我无法找到检索此信息的解决方案。

你能用你的想法挑战我吗:)

谢谢!


所以这是我的问题,不,我正在用我发现与我的案例更相关的解决方案更新帖子:

这个想法是创建一个将在构建时执行的Roslyn 分析器,该分析器将读取 startup.cs 文件以检查是否引用了目标“CustomAuthorizationFilter”: