我正在为Orchard开发一个模块,它将通过查找经过身份验证的用户权限来限制Media文件夹中的项目。
首先是在Media文件夹中编辑web.config,如下所示:
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:custom="http://schemas.android.com/apk/res-auto"
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="@dimen/detail_backdrop_height"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
android:fitsSystemWindows="true">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapsing_toolbar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="bottom"
app:layout_scrollFlags="scroll|exitUntilCollapsed"
android:fitsSystemWindows="true"
app:contentScrim="?attr/colorPrimary"
app:expandedTitleMarginStart="48dp"
app:expandedTitleTextAppearance="@style/HeaderTitleStyle"
app:expandedTitleMarginEnd="64dp">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_collapseMode="parallax"
android:fitsSystemWindows="true">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/imgProfileUserImage"
android:adjustViewBounds="true"
android:scaleType="fitXY"
android:src="@drawable/cheese_1"
android:alpha="0.35" />
<Cheesesquare.Utils.CircleImageView
android:layout_width="180dp"
android:layout_height="180.0dp"
android:id="@+id/imgProfileCircleImage"
android:src="@drawable/cheese_2"
custom:border="true"
custom:border_color="#d5d5d5"
custom:border_width="4dp"
custom:shadow="true"
android:layout_gravity="center"
android:minHeight="80dp"
android:minWidth="80dp" />
</FrameLayout>
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:layout_collapseMode="pin" />
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingTop="24dp">
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/card_margin">
<LinearLayout
style="@style/Widget.CardContent"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Info"
android:textAppearance="@style/TextAppearance.AppCompat.Title" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/cheese_ipsum" />
</LinearLayout>
</android.support.v7.widget.CardView>
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/card_margin"
android:layout_marginLeft="@dimen/card_margin"
android:layout_marginRight="@dimen/card_margin">
<LinearLayout
style="@style/Widget.CardContent"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Friends"
android:textAppearance="@style/TextAppearance.AppCompat.Title" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/cheese_ipsum" />
</LinearLayout>
</android.support.v7.widget.CardView>
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/card_margin"
android:layout_marginLeft="@dimen/card_margin"
android:layout_marginRight="@dimen/card_margin">
<LinearLayout
style="@style/Widget.CardContent"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Related"
android:textAppearance="@style/TextAppearance.AppCompat.Title" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/cheese_ipsum" />
</LinearLayout>
</android.support.v7.widget.CardView>
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
<android.support.design.widget.FloatingActionButton
android:layout_height="wrap_content"
android:id="@+id/uploadPhotoButton"
android:layout_width="wrap_content"
app:layout_anchor="@id/appbar"
app:layout_anchorGravity="bottom|right|end"
android:src="@drawable/ic_discuss"
android:layout_margin="@dimen/fab_margin"
android:clickable="true"/>
在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>
当我导航到媒体项目时,url系统会抛出MissingMethodException。这是正常的,因为系统找不到无参数构造函数。
那么,我如何将Orchard服务注入IHttpHandler?
答案 0 :(得分:1)
你看过Glympse了吗?使用HttpHandlers,这是一个SO问题here。
有一个让我思考的讨论here。
让你的web.configs工作,它应该没问题。我不知道IDependency
位,可能不需要它。
答案 1 :(得分:1)
你肯定无法注射。对不起,我在之前的回答中省略了。
您可以创建一个Orchard模块,添加过滤器或控制器,劫持您指定的路径,并从实际安全的地方提供文件。
Orchard接管IIS。这就是为什么你需要在文件夹的web.config中添加staticfilemodule,让IIS进入,这就是使它不安全的原因。
如果你真的需要走这条路,也许可以快速拨打Orchard服务电话或直接与db通话。
答案 2 :(得分:1)
虽然您无法注入这样的依赖关系,但您仍然可以使用IShim
的魔力访问Orchard&#d DI容器。看看如何,例如OrchardLog4netLogger
解析了IOrchardHostContainer
的依赖关系。
请注意,此容器是应用程序范围内的容器:为了能够解析您的标准IDependency
类型,您需要首先从{{1}获取ShellContext
},然后从IOrchardHost
WorkContextScope
创建LifetimeScope
。
我知道这看起来很复杂,确实涉及很多箍。但最重要的是,通过这种方式,您可以在任何类别中解析Orchard&(及其shell&#39;)DI容器中的服务。