2017-02-20 1 views
0

Я использую servicestack v3. У меня есть два веб-сайта (службы общего обслуживания и службы хранения) в IIS, где развертываются службы сервисной службы. На веб-сайте государственных служб нам нужно использовать определенные фильтры ответов. Принимая во внимание, что они не требуются на веб-сайте служб хранения.Могу ли я зарегистрировать фильтр отклика servicestack внутри web.config?

Мне было интересно, можно ли зарегистрировать фильтры ответов внутри web.config, а не внутри метода AppHost.Configure, чтобы упростить их регистрацию только на веб-сайтах, где они необходимы, и использовать одну и ту же сервисную программу (AppHost) DLLs. Я бы предпочел не иметь две разные версии кода dlls servicestack (Apphost). Код Apphost находится в C#, а фактические службы записываются в F #.

Спасибо.

ответ

0

В конце концов, я следовал за эти шаги, чтобы создать настраиваемые подключаемые 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) остается таким же на всех сайтах.

Смежные вопросы