控制器上的mvc 5属性被忽略

时间:2017-10-19 19:54:52

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

几个月前,我写了一个带有一些自定义属性的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,并将解决我面临的问题,但是我的工作将不允许这样做。

谢谢,

鲍勃

1 个答案:

答案 0 :(得分:0)

我解决了我的大多数问题,并且有一个我无法解决的最后一项。 简而言之,关于属性的最高级别,WebAPI和MVC似乎具有相同的对象,但随着您的深入,事情真的变得与众不同。

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

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

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

除了一个代码之外,我能够为每个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. 我找不到翻译的最后一段代码,希望其他人知道答案。

  3. 感谢....鲍勃