几个月前,我写了一个带有一些自定义属性的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,并将解决我面临的问题,但是我的工作将不允许这样做。
谢谢,
鲍勃
答案 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)
我想阅读响应内容,以便我可以记录或更改它,或者其他任何内容。
总结:
问题的一般解决方案是小心地从自定义属性的顶部开始,将名称空间更改为MVC,然后通过代码替换WEBapi代码和MVC等效代码。非常讨厌和乏味。如果有人尝试类似的东西并且有问题我会很乐意提供帮助。
我找不到翻译的最后一段代码,希望其他人知道答案。
感谢....鲍勃