【问题标题】:mvc 5 attributes on controller are being ignored控制器上的 mvc 5 属性被忽略
【发布时间】:2018-03-31 23:10:15
【问题描述】:

几个月前,我编写了一个带有一些自定义属性的 WebApi 应用程序。效果很好。

我现在正在编写一个新的 MVC 5.2.3 网站,并希望包含相同的属性。我将它们移过来,项目构建和运行都很好,只是属性被忽略了。

这是我的控制器装饰:

[AuthorizeIt(Roles = "theRole")] 
[LogRequestResponse] 
public class HomeController : Controller{}

这是我的两个属性的签名:

public class LogRequestResponseAttribute : ActionFilterAttribute


[AttributeUsage(AttributeTargets.All, Inherited = true, AllowMultiple = true)]
public class AuthorizeItAttribute : AuthorizeAttribute

我可以包含更多代码,但我认为这实际上不是代码问题,因为它适用于我的其他网站。我猜这是 MVC 和 WebApi 之间的区别,我缺少一些小细节。

是的,我知道 ASP.core 集成了 webApi 和 MVC,可以解决我面临的问题,但是我的工作不允许这样做。

谢谢,

鲍勃

【问题讨论】:

  • 附加信息:新信息:如果我将控制器更改为从 ApiController 继承,我的属性可以正常工作。改回来,他们没有。

标签: asp.net-mvc-5 controller custom-attributes actionfilterattribute


【解决方案1】:

我解决了大部分问题,最后一项我无法解决。 简而言之,在最高级别的属性方面,WebAPI 和 MVC 似乎具有相同的对象,但随着深入,事情真的会变得不同。

例如:AuthorizeAttribute 因您使用的命名空间而异。 MVC 版本需要 AuthorizationContext 参数,而 WebApi 需要 HttpActionContext。

另一个例子是 OnActionExecuted 函数想要一个 ActionExecutedContext 作为 MVC 的参数,但 webApi 想要一个 HttpActionExecutedContext。

我能做的就是把我原来的 WebApi 属性放到我的 MVC 项目中,然后从顶部开始确保你在 MVC 命名空间中,然后开始向下钻取并根据需要更改对象。

我能够为除一个之外的每个 webApi 代码段找到一个 MVC 等效项。

对于 WebAPI,在 OnActionExecuted 函数中,我可以通过以下方式获取响应的内容:

    var response = actionContext.Response?.Content?.ReadAsStringAsync().Result;

地点:

actionContext is a HttpActionExecutedContext

但在 MVC 中

actionContext is a ActionExecutedContext

所以上面获取响应的 webapi 代码在 MVC 中不起作用。 从我一直在阅读 MVC 中的响应内容来看,位于:

actionContext.HttpContext.Response.Filter

这是一个流。但是无论我尝试了多少不同的方式来读取流,它总是处于不可读的状态。

我的问题最后一个未回答的部分是:

MVC 5:我正在编写自定义属性。我在函数中:

    public override void OnActionExecuted(ActionExecutedContext actionContext)

我想阅读响应内容,以便例如记录或更改它,或其他任何内容。

总结:

  1. 该问题的一般解决方案是仔细从自定义属性的顶部开始,将名称空间更改为 MVC,然后通过代码将 WEBapi 代码替换为 MVC 等效代码。非常烦人和乏味。如果有人正在尝试类似的事情并有疑问,我很乐意提供帮助。

  2. 最后一段代码我找不到翻译,希望其他人知道答案。

谢谢....鲍勃

【讨论】:

    猜你喜欢
    • 2021-08-26
    • 2014-10-04
    • 2021-11-24
    • 1970-01-01
    • 2018-01-31
    • 2011-05-22
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多