ActionFilter не выполняется в WebApplication, но выполняется в WebApi

Я создал ActionFilterAttribute

public class LoggingNHibernateSessionAttribute : ActionFilterAttribute

Целью фильтра, как следует из названия, является регистрация, открытие и фиксация транзакции до и после целевого действия соответственно.

У меня есть проект WebApi (myAPI) (MVC4) и WebApplication (myContent).

Каждый контроллер API в myAPI украшен этим атрибутом.

using myApp.Web.Common.Filters;

namespace myAPI.Web.Api.Controllers
{
    [LoggingNHibernateSession]
    public class CategoriesController : ApiController
    {

Когда действие Http (Get/Post) выполняется внутри ApiController, 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.

Что я здесь делаю неправильно?


person jaxxbo    schedule 19.05.2013    source источник


Ответы (1)


Хотя WebApi и MVC очень похожи и технически состоят из одного и того же кода, WebApi был создан путем копирования всего кода, а не повторного использования. Мне сказали, что это произошло потому, что команда WCF не хотела зависимости от сборок MVC.

Поэтому код (например, ваш пользовательский фильтр), скомпилированный для одной сборки, не будет работать в контексте другой.

Решение состоит в том, чтобы продублировать собственный код и скомпилировать его для обоих наборов сборок. Вы также можете настроить систему сборки для кросс-компиляции одних и тех же файлов кода с использованием разных эталонных сборок.

Это действительно печально, когда внутренняя политика компании приводит к чему-то подобному. Самое меньшее, что они могли сделать, это признать проблему и добавить в свой инструментарий надлежащую поддержку кросс-компиляции, но, увы, я отвлекся.

person Morten Mertner    schedule 19.05.2013
comment
Вот что я переключил System.Web.Http.Filters.FilterAttribute на System.Web.Mvc.FilterAttribute, и это решило мою проблему. - person Jesse Potter; 02.02.2016