基于这个SO答案:https://stackoverflow.com/a/2066040/458354我有一个web.config,它定义了一个子目录中所有文件的自定义HttpHandler,放在我的静态文件子目录中。如果目录(即使配置为虚拟目录)与IIS位于同一服务器上,则此方法也可以正常工作。但是,如果虚拟目录指向另一台服务器上的共享文件夹,则在访问静态资源时会收到此错误:“加载配置文件时出错:文件监视的文件名无效:'\\ remoteserver \ remotedir \的web.config“”。
我甚至已经从Web服务器向IIS_IUSR授予了远程目录的权限。我怀疑问题是配置路径是一个共享。有关允许IIS读取虚拟目录web.config的方法的任何想法吗?
或者,有没有办法在站点的普通web.config中配置处理程序路径以覆盖整个子目录?
有问题的配置行:
<add name="MyRequestHandler" type="MyApp.StaticFileRequestHandler,
MyApp" path="*" resourceType="Either" verb="GET,HEAD"
requireAccess="Read"/>
答案 0 :(得分:0)
见401 Unauthorized when custom IHttpHandler tries to read from virtual directory。将ApplicationPool标识设置为将用于连接到远程虚拟目录的相同标识(例如,可以是服务帐户)。
另外,关于将Handler分配给子目录的替代方法,我最终将应用程序设计更改为使用asp.net路由(而不是MVC)并让url请求通过标识符指定所需的静态文件(可能并不总是可取的,但在我们的应用程序环境中已经是其他地方的现有实践)。这消除了在虚拟目录中对子web.config的需要,因为然后可以以编程方式分配处理程序:
public static void RegisterRoutes(RouteCollection routes)
{
// fileId must be all digits, with at least one digit
var routeConstraints = new RouteValueDictionary { { "fileId", @"\d{1,}" } };
var getProtectedFileRoute = new Route("resources/files/{fileId}", new MyFileRequestRouteHandler())
{
Constraints = routeConstraints
};
routes.Add(getProtectedFileRoute);
}
标识符不再是通配符,而是RouteData
参数。 (如果标识符是带有'dot'和扩展名的文件名,则不确定这是否有效。)