System.Web.Http.Filters.ActionFilterAttribute必须与控制器位于同一个项目中?

smi*_*ing 6 c# asp.net-mvc asp.net-web-api

我有一个System.Web.Http.ApiController派生的控制器:

[LoggingFilterApi]
public class BaseController : ApiController
{
     public IHttpActionResult Ads();
}
Run Code Online (Sandbox Code Playgroud)

过滤器定义如下:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果LoggingFilterApiAttribute.cs是控制器的组成部分.csproj,OnActionExecuting如预期被调用.但是,如果LoggingFilterApiAttribute.cs移动到另一个.csproj(以方便代码重用),OnActionExecuting不会按预期调用.奇怪的.

谁见过这个?目前我在我们的项目中复制过滤器,这有点不太理想.这是ASP.NET MVC 5.2.

干杯,皮特

Was*_*asp 5

您很可能在Web Api 2版本中存在不匹配.无论哪个版本的MVC,你的控制器都是Web Api,所以你必须注意Web Api相关的程序集.

我很确定,如果你检查System.Web.HttpMVC项目和类库中的版本,它们会有所不同,因此发现机制无法找到你的自定义过滤器.只需通过使问题匹配来解决问题,它应该可行.

解决这个问题的一个简单方法是Microsoft.AspNet.WebApi.Core在类库中引用最新的Web Api 2软件包(),升级MVC项目中的相同软件包以使它们匹配(或者如果你愿意,可以通过搞乱程序集重定向).例如,如果您只是将代码复制到类库中,然后使用Resharper之类的东西来解析引用,那么它很可能System.Web.Http从GAC中选择了4.x版,而不是此处需要的版本5.x.

我尝试了你做了什么,它再现了你的同样的问题,这个程序解决了它.