我有2个域名(sharey
和.com
)以及2个网址,例如.ru
和site.com/about-us
,应重定向到同一网页 。该网站使用Razor Pages。
此外,特定的URL应该在适当的域中可用。例如:
site.ru/o-nas
不应该有效并返回site.COM/o-nas
Not Found (404)
不应该有效并返回site.RU/about-us
我发现过滤器工作正常,但对于Not Found (404)
和site.com/about-us
,两个过滤器都会被调用。
如何仅针对特定网址拨打1,是否可以?谢谢,我目前的代码如下。
site.ru/o-nas
最后来自public static class DomainFilters
{
public static IPageApplicationModelConvention DomainEng(
this PageConventionCollection con, string pageName, string route = "")
{
return con.AddPageApplicationModelConvention(pageName, model =>
{
model.Filters.Add(new EnglishActionFilter(route));
});
}
public static IPageApplicationModelConvention DomainRussian(
this PageConventionCollection con, string pageName, string route = "")
{
return con.AddPageApplicationModelConvention(pageName, model =>
{
model.Filters.Add(new RussianActionFilter(route));
});
}
}
public class EnglishActionFilter : IResultFilter
{
public void OnResultExecuting(ResultExecutingContext context)
{
if (context.HttpContext.Request.Host.ToString().Contains(".ru"))
{
context.Result = new NotFoundResult();
}
}
public void OnResultExecuted(ResultExecutedContext context) { }
}
public class RussianActionFilter : IResultFilter
{
public void OnResultExecuting(ResultExecutingContext context)
{
if (context.HttpContext.Request.Host.ToString().Contains(".com"))
{
context.Result = new NotFoundResult();
}
}
public void OnResultExecuted(ResultExecutedContext context) { }
}
的{{1}}方法:
ConfigureServices
答案 0 :(得分:1)
考虑实施自定义FilterFactory
:
public class LanguageFilterFactory : Attribute, IFilterFactory
{
public bool IsReusable => false;
public IFilterMetadata CreateInstance(IServiceProvider serviceProvider)
{
var context = serviceProvider.GetService<IHttpContextAccessor>();
if (context.HttpContext.Request.Host.ToString().Contains(".com"))
{
return new EnglishActionFilter();
}
return new RussianActionFilter();
}
}
此工厂将创建English
或Russian
过滤器(具体取决于域)。这完全是关于它的责任。剩下的就是过滤器本身(你需要更改过滤器内部的代码以使它们验证页面定位器):
public class RussianActionFilter : IResultFilter
{
public void OnResultExecuting(ResultExecutingContext context)
{
// you may want to play with RouteData in order to make this check more elegant
if (context.HttpContext.Request.Path.Value.Contains("About"))
{
context.Result = new NotFoundResult();
}
}
}
过滤器工厂的应用方式与其他过滤器相同:
[LanguageFilterFactory]
public class IndexModel : PageModel
Startup.cs
文件更新:
.AddMvcOptions(options =>
{
options.Filters.Add<LanguageFilterFactory>();
});