c# – System.Web.Http.Filters.ActionFilterAttribute必须与控
我有一个System.Web.Http.ApiController派生的控制器:
[LoggingFilterApi] public class BaseController : ApiController { public IHttpActionResult Ads(); } 过滤器定义如下: using System.Web.Http.Controllers; using System.Web.Http.Filters; namespace pecom.Common.Filters { public class LoggingFilterApiAttribute : ActionFilterAttribute { public override void OnActionExecuting(HttpActionContext ctx) { var msg = ctx.ActionDescriptor.ControllerDescriptor.ControllerType.Name + "." + ctx.ActionDescriptor.ActionName + "(" + ctx.Request.RequestUri.ToString(); ILog logger = LogManager.GetLogger(ctx.ActionDescriptor.ControllerDescriptor.ControllerType); logger.Info(msg); base.OnActionExecuting(ctx); } } } 当LoggingFilterApiAttribute.cs是控制器的.csproj的一部分时,将按预期调用OnActionExecuting.但是,如果将LoggingFilterApiAttribute.cs移动到另一个.csproj(以便于代码重用),则不会按预期调用OnActionExecuting.奇怪的. 谁见过这个?目前我在我们的项目中复制过滤器,这有点不太理想.这是ASP.NET MVC 5.2. 干杯,皮特 解决方法
您很可能在Web Api 2版本中存在不匹配.无论哪个版本的MVC,你的控制器都是Web Api,所以你必须注意Web Api相关的程序集.
我很确定,如果你在MVC项目和你的类库中检查System.Web.Http的版本,它们会有所不同,因此发现机制无法找到你的自定义过滤器.只需通过使问题匹配来解决问题,它应该可行. 解决这个问题的一个简单方法是在类库中引用最新的Web Api 2软件包(Microsoft.AspNet.WebApi.Core),并升级MVC项目中的相同软件包以使它们匹配(或者通过搞乱程序集重定向如果你愿意的话).例如,如果您只是将代码复制到类库中,然后使用Resharper之类的东西来解析引用,那么很可能从GAC中选择版本4.x的System.Web.Http而不是版本5.x你需要的. 我尝试了你做了什么,它再现了你的同样的问题,这个程序解决了它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |