0

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

感谢,

鲍勃

+0

附加信息:新信息:如果我改变我的控制器从ApiController继承我的属性,做工精细。改回来,他们没有。 – Bob

回答

0

我大部分解决了我的问题,并有我解决不了最后一个项目。 简而言之,在属性的最高级别上,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. 有一段代码我找不到译文,希望别人知道答案。

感谢....鲍勃