控制器上的mvc 5属性被忽略
几个月前,我编写了一个带有一些自定义属性的WebApi应用程序。它效果很好。控制器上的mvc 5属性被忽略
我现在正在编写一个新的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,并将解决我面临的问题,但我的工作将不会允许这样做。
感谢,
鲍勃
我大部分解决了我的问题,并有我解决不了最后一个项目。 简而言之,在属性的*别上,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)
而且我想读取响应内容,以便我可以例如记录它或改变它,或任何。
总结:
一般的解决问题的办法就是认真开始在定制的*属性,名称空间更改为MVC,然后通过代码工作更换的WebAPI码与MVC相当。非常烦人和乏味。如果有人正在尝试类似的东西,并有问题,我很乐意提供帮助。
有一段代码我找不到译文,希望别人知道答案。
感谢....鲍勃
附加信息:新信息:如果我改变我的控制器从ApiController继承我的属性,做工精细。改回来,他们没有。 – Bob