我有一个场景,在我的项目中,我必须处理 Internet 和 Intranet 两种模式。现在我必须基于模式应用过滤器,基于模式应用过滤器的最佳方法是什么(有条件地)。
一种方法是创建自定义过滤器提供程序并注册它。但是我如何以及何时可以检查应用程序模式。
谢谢,-巴布
我有一个场景,在我的项目中,我必须处理 Internet 和 Intranet 两种模式。现在我必须基于模式应用过滤器,基于模式应用过滤器的最佳方法是什么(有条件地)。
一种方法是创建自定义过滤器提供程序并注册它。但是我如何以及何时可以检查应用程序模式。
谢谢,-巴布
假设您正在使用Phil Haacked 的 Conditional Filter Provider:
public class ConditionalFilterProvider : IFilterProvider {
private readonly
IEnumerable<Func<ControllerContext, ActionDescriptor, object>> _conditions;
public ConditionalFilterProvider(
IEnumerable<Func<ControllerContext, ActionDescriptor, object>> conditions)
{
_conditions = conditions;
}
public IEnumerable<Filter> GetFilters(
ControllerContext controllerContext,
ActionDescriptor actionDescriptor) {
return from condition in _conditions
select condition(controllerContext, actionDescriptor) into filter
where filter != null
select new Filter(filter, FilterScope.Global, null);
}
}
并且您有两个自定义的 ActionFilterAttribute,分别称为 IntranetAttribute 和 InternetAttribute。假设所有 Intranet 请求都来自 IP 地址:10.122.122.12 或 10.122.122.13。
您可以像这样在 Application_Start 中配置条件提供程序:
private void ConfigureModeAttribute()
{
//Configure a conditional filter
string[] intranetIPs = { "10.122.122.12", "10.122.122.13" };
IEnumerable<Func<ControllerContext, ActionDescriptor, object>> conditions =
new Func<ControllerContext, ActionDescriptor, object>[] {
( c, a ) => intranetIPs.Contains(c.HttpContext.Request.UserHostAddress) ?
new IntranetAttribute() : new InternetAttribute()
};
var provider = new ConditionalFilterProvider(conditions);
// This line adds the filter we created above
FilterProviders.Providers.Add(provider);
}
希望对您有所帮助!