0

基于这个 SO 答案:https ://stackoverflow.com/a/2066040/458354我有一个 web.config,它为子目录中的所有文件定义了一个自定义 HttpHandler,放在我的静态文件子目录中。如果该目录(即使配置为虚拟目录)与 IIS 位于同一台服务器上,这将非常有效。但是,如果虚拟目录指向另一台服务器上的共享文件夹,我在访问静态资源时收到此错误:“加载配置文件时出错:文件监控的文件名无效:'\\remoteserver\remotedir\web.配置'。”

我什至已将远程目录的权限从网络服务器授予 IIS_IUSR。我怀疑问题是配置路径是共享的。关于允许 IIS 读取虚拟目录 web.config 的方法有什么想法吗?

或者,有没有办法在站点的普通 web.config 中配置处理程序路径以覆盖整个子目录?

有问题的配置行:

<add name="MyRequestHandler" type="MyApp.StaticFileRequestHandler,
MyApp" path="*" resourceType="Either" verb="GET,HEAD"
requireAccess="Read"/>
4

1 回答 1

0

当自定义 IHttpHandler 尝试从虚拟目录读取时,请参阅401 Unauthorized 。将 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参数。(不确定如果标识符是带有“点”和扩展名的文件名,这是否可行......)。

于 2013-01-25T17:40:43.597 回答