我有一个Asp.Net Core 1 RC1
应用程序,它使用自定义路由约束来控制对应用程序的访问。应用程序(托管在运行的服务器上IIS 7.5
)出现间歇性 404 错误,我怀疑这是由此路由约束引起的。在这里,您可以看到显示间歇性 404 错误的屏幕截图:
我怀疑这个问题与定义路由约束的代码不是线程安全的有关。自定义路由约束需要一个DbContext
,因为它需要检查数据库是否为路由中指定的品牌启用了应用程序,我怀疑这个DbContext
实例可能会导致问题。以下是在应用程序中定义路由的方式:
// Add MVC to the request pipeline.
var appDbContext = app.ApplicationServices.GetRequiredService<AppDbContext>();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "branding",
template: "branding/{brand}/{controller}/{action}/{id?}",
defaults: new { controller="Home", action="Index" },
constraints: new { brand = new BrandingRouteConstraint(appDbContext) });
});
这是自定义路由约束:
// Custom route constraint
public class BrandingRouteConstraint : IRouteConstraint
{
AppDbContext _appDbContext;
public BrandingRouteConstraint(AppDbContext appDbContext) : base() {
_appDbContext = appDbContext;
}
public bool Match(HttpContext httpContext, IRouter route, string routeKey, IDictionary<string, object> values, RouteDirection routeDirection)
{
if (values.Keys.Contains(routeKey))
{
var whiteLabel = _appDbContext.WhiteLabels.Where(w => w.Url == values[routeKey].ToString()).FirstOrDefault();
if (whiteLabel != null && whiteLabel.EnableApplication != null && (bool)whiteLabel.EnableApplication)
{
return true;
}
}
return false;
}
}
任何人都可以确认此问题是由代码不是线程安全引起的,并推荐一种更改实现以使其线程安全的方法吗?