2015-10-12 7 views
0

Я разрабатываю модуль для Orchard, который будет ограничивать элементы в папке Media, просматривая аутентифицированные разрешения пользователя.Как внедрить службы в пользовательский IHttpHandler в Orchard

Первая вещь редактирования web.config в папке СМИ, как это:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <appSettings> 
    <add key="webpages:Enabled" value="false" /> 
    </appSettings> 
    <system.web> 
    <httpHandlers> 
     <add path="*" verb="*" type="MediaFileAccess.AuthorizedMediaHandler" /> 
    </httpHandlers> 
    </system.web> 
    <system.webServer> 
    <staticContent> 
     <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="7.00:00:00" /> 
    </staticContent> 
    <handlers accessPolicy="Script,Read"> 
     <add name="AuthorizedFile" path="*" verb="*" 
      type="MediaFileAccess.AuthorizedMediaHandler,MediaFileAccess" 
      preCondition="integratedMode" /> 
    </handlers> 
    </system.webServer> 
</configuration> 

Обработчик, который зарегистрирован в web.config:

public class AuthorizedMediaHandler : IHttpHandler, IDependency 
{ 
    private readonly IAuthenticationService _authenticationService; 

    public AuthorizedMediaHandler(IAuthenticationService authenticationService) 
    { 
     _authenticationService = authenticationService; 
    } 

    public bool IsReusable { get { return false; } } 

    public void ProcessRequest(HttpContext context) 
    { 
     // Do something using the injected services... 
    } 
} 

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

Итак, как я могу вставлять сервисы Orchard в IHttpHandler?

ответ

1

Пока вы не сможете вводить зависимости, подобные этому, вы все равно можете получить доступ к контейнеру DI Orchard'd с магией IShim. Посмотрите, как, например, OrchardLog4netLogger разрешает зависимости от IOrchardHostContainer.

Имейте в виду, что хотя этот контейнер является приложением шириной один: чтобы быть в состоянии решить ваши стандартные типы IDependency вам нужно сначала получить ShellContext от IOrchardHost, а затем создать WorkContextScope из его LifetimeScope в LifetimeScope.CreateWorkContextScope().

Я знаю, что это кажется сложным, и действительно, есть много обручей. Но суть в том, что таким образом вы можете разрешать услуги из контейнеров DI Orchard (и его оболочек) в любом классе.

1

Вы проверили Glympse? использует HttpHandlers, theres вопрос SO here.

есть обсуждение here, что заставило меня задуматься.

Получите ваш web.configs рабочий, и все должно быть в порядке. Я не знаю о бит IDependency, может и не понадобится.

+0

Я не нашел спасительный код Orchard в Glympse, он не потребляет услуги Orchard, как я вижу :( –

+0

yeap, позвольте мне получить вам еще один ответ ... – ErMasca

1

Вы, безусловно, не сможете впрыснуть. извините, я пропустил это в своем ответе раньше.

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

Orchard берет на себя IIS. поэтому вам нужно добавить staticfilemodule в web.config папки, чтобы включить IIS, и именно это делает его небезопасным.

Если вам действительно нужно идти по этой дороге, возможно, очень быстрый вызов службы Orchard или разговор прямо с db.

+0

Я создал контроллер и установил маршрут с помощью " Media/{* path} ", а затем установите RouteCollection.RouteExistingFiles в true в файле Global.asax.cs, в конце концов он работает :) –