我创建了一个ActionFilterAttribute
public class LoggingNHibernateSessionAttribute : ActionFilterAttribute
过滤器名称的目的是分别在目标操作之前和之后记录并打开和提交事务。
我有一个WebApi(myAPI)项目(MVC4)和一个WebApplication(myContent)。
myAPI中的每个Api控制器都使用此属性进行修饰。
using myApp.Web.Common.Filters;
namespace myAPI.Web.Api.Controllers
{
[LoggingNHibernateSession]
public class CategoriesController : ApiController
{
当在ApiController中执行Http动作(Get / Post)时,ActionFilter会被执行并且按预期正常工作。
问题: 在WebApplication(myContent)中,我还使用ActionFilter修饰了这些控制器。
using myApp.Web.Common.Filters;
namespace myContent.Web.Content.Places.Controllers
{
[LoggingNHibernateSession]
public class PlacesController : Controller
{
但是在这里,当在控制器内部执行动作时,ActionFilter不会被执行。
ActionFilter属于 System.Web.Http.Filters ;
我已经阅读了一些帖子,他们说要使用System.Web.Mvc过滤器。所以我将ActionFilter更改为来自 System.Web.Mvc 当我切换它时,ActionFilter也停止在WebApi中工作。
我在这里做错了什么?
答案 0 :(得分:5)
尽管WebApi和MVC非常相似且技术上由大致相同的代码组成,但WebApi是通过复制所有代码而不是通过重用来创建的。我被告知,这发生了,因为WCF团队不希望依赖MVC程序集。
因此,针对一个程序集编译的代码(例如您的自定义筛选器)将无法在另一个程序集的上下文中工作。
解决方案是复制您自己的代码并针对两组程序集进行编译。您还可以设置构建系统,以使用不同的引用程序集交叉编译相同的代码文件。
当内部公司政治导致这样的事情时,真的很难过。他们能做的最少就是承认这个问题,并为他们的工具添加一些适当的交叉编译支持,但唉,我离题了。