В конце концов, я следовал за эти шаги, чтобы создать настраиваемые подключаемые responsefilters:
1) Создан длл содержащего ICustomResponseFilter интерфейс:
public interface ICustomResponseFilter
{
Action<IHttpRequest, IHttpResponse, object> GetAction();
}
2) Создано DLL, содержащий класс для фактического фильтра ответа, который должен регистрироваться, который реализует выше интерфейс:
public class AuthResponseFilter : ICustomResponseFilter
{
public Action<IHttpRequest, IHttpResponse, object> GetAction()
{
// code implementation that returns Action type
}
}
3) сохраняемого имена типа для фильтров в базе данных (configurat ион).
table: SSResponseFilters
important columns:
typename: varchar (values in format: <namespace>.<classname>)
assemblyname: varchar (values in format: <assemblyname>)
site: varchar (possible values: public|storage)
Эта конфигурация может быть сделано в другом месте также, например, в web.config
4) используется пользовательский класс Apphost. Внутри этого класса регистрируются фильтры:
public class CustomAppHost : AppHostBase
{
private List<Action<IHttpRequest, IHttpResponse, object>> responseFilterActions = null;
public CustomAppHost(serviceType, serviceName, assemblies) : base(serviceName, assemblies)
{
List<ICustomResponseFilter> rfList = GetListOfConfiguredResponseFilters(serviceType);
/*In GetListOfConfiguredResponseFilters method, serviceType is taken from config and it determines which site we are in currently and retrieves the configured types explained in above step for that site. We need to use reflection here.*/
this.responseFilterActions = GetActionsListFromResponseFilters(rfList);
/*GetActionsListFromResponseFilters method calls the GetAction method of the filters and generates a list of Action types and returns that list*/
}
public override void Configure(Funq.Container container)
{
// other code ..
EndpointHost.ResponseFilters.AddRange(responseFilterActions);
}
}
5) На каждом сайте необходима DLL, содержащая интерфейс. Всякий раз, когда должен быть подключен новый фильтр ответов, мы можем написать DLL, содержащую класс, который реализует интерфейс и вносит запись в БД для фильтра. Фильтры ответного фильтра могут использоваться только там, где это необходимо. DLL-файл службы (AppHost) остается таким же на всех сайтах.