如何将服务注入到Orchard中的自定义IHttpHandler中

本文关键字:自定义 IHttpHandler Orchard 服务 注入 | 更新日期: 2023-09-27 18:17:28

我正在为Orchard开发一个模块,该模块将通过查找经过身份验证的用户权限来限制Media文件夹中的项目。

第一件事是编辑网页。在Media文件夹中配置如下:

<?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中呢?

如何将服务注入到Orchard中的自定义IHttpHandler中

虽然你不能像这样注入依赖,但你仍然可以使用IShim的魔力访问Orchard'd DI容器。查看OrchardLog4netLogger如何从IOrchardHostContainer中解析依赖项。

请记住,这个容器是应用程序范围的容器:为了能够解决您的标准IDependency类型,您需要首先从IOrchardHost获得ShellContext,然后从其LifetimeScope创建WorkContextScope作为LifetimeScope.CreateWorkContextScope()

我知道这看起来很复杂,而且确实有很多问题。但最重要的是,通过这种方式,您可以在任何类中解析来自Orchard(及其shell)的DI容器的服务。

你看过Glympse吗?使用HttpHandlers,这里有一个问题。

这里的讨论引起了我的思考。

拿你的网。配置工作,它应该是好的。我不知道IDependency位,可能不需要它

你肯定不能注射。对不起,我在之前的回答中遗漏了。

你可以创建一个Orchard模块来添加一个过滤器,或者用一个Controller来劫持你指定的路由,并从一个真正安全的地方提供文件。

Orchard接管IIS。这就是为什么需要在文件夹的web中添加staticfilemodule的原因。配置,让IIS进入,这就是它不安全的原因。

如果你真的需要走那条路,也许给Orchard打一个非常快速的服务电话,或者直接与数据库交谈。