如何将服务注入到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中呢?虽然你不能像这样注入依赖,但你仍然可以使用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打一个非常快速的服务电话,或者直接与数据库交谈。