1

我有这些设置:

    CustomHttpHandlers = {
        {HttpStatusCode.NotFound, new RazorHandler("/notfound")},
        {HttpStatusCode.Unauthorized, new RazorHandler("/unauthorized")},
    }

当我访问/stars不存在的文件夹中的内容时:

/stars/asdf/xyz

它首先检查/stars/asdf/default.cshtml. 然后转到stars/default.cshtml并加载具有default页面的任何级别。因此,只有当/stars根文件夹根本不存在时,/notfound才会被加载。

是否可以要求它在不存在/notfound时加载?/asdf/xyz

这是根目录下的行为:

http://localhost:2000/asdf会带你去/notfound。但是,它不会在文件夹下这样做。

给你。

编辑 - - - - - - - - - - - - - - - - - - - - - - - - - -----

我实际上注意到,如果我转到没有默认值但实际上存在 root 的错误 url,在这种情况下,两个/stars/asdf- >都会一个接一个地加载?!?/stars/default.cshtml/notfound/default

我的设置有问题吗?SS出问题了?

4

1 回答 1

1

ServiceStack 的路由优先级,如下。ServiceStack 调用ServiceStackHttpHandlerFactory.GetHandler以获取当前路由的处理程序。

ServiceStackHttpHandlerFactory.GetHandler返回:

  1. 一个匹配的 RawHttpHandler,如果有的话。
  2. 如果是域根,则返回的处理程序( GetCatchAllHandlerIfAny(...),如果有)。
  3. 如果路由匹配元数据 uri,则相关处理程序(如果有)。
  4. 返回的处理程序(ServiceStackHttpHandlerFactory.GetHandlerForPathInfo如果有)。
  5. 未找到处理程序。

ServiceStackHttpHandlerFactory.GetHandlerForPathInfo返回:

  1. 如果 url 匹配一个有效的 REST 路由,一个新的 RestHandler。
  2. 如果 url 与现有文件或目录匹配,则返回
    • 如果有的话,返回的处理程序 GetCatchAllHandlerIfAny(...),
    • 如果它是受支持的文件类型,StaticFileHandler,
    • 如果它不是受支持的文件类型,则为 ForbiddenHttpHandler。
  3. 返回的处理程序(GetCatchAllHandlerIfAny(...),如果有)。
  4. 无效的。

CatchAllHandlers 数组包含评估 url 并返回处理程序或 null 的函数。数组中的函数按顺序调用,第一个不返回 null 的函数处理路由。

控制是否提供默认文件的代码是 StaticFileHandler 的一部分。它仅对现有文件和目录调用。

这是相关的片段:

foreach (var defaultDoc in EndpointHost.Config.DefaultDocuments)
{
    var defaultFileName = Path.Combine(fi.FullName, defaultDoc);
    if (!File.Exists(defaultFileName)) continue;
    r.Redirect(request.GetPathUrl() + '/' + defaultDoc);
    return;
}

如您所见,如果在请求的目录中找不到默认文件,它将向上重定向目录链,直到找到要提供的默认文件。如果您需要更改此行为,您可以通过添加 CatchAllHander 代码来覆盖它。有关编写 CatchAllHandler 的更多详细信息,请参见我对相关问题的回答,此处:https ://stackoverflow.com/a/17618851/149060

于 2013-07-15T14:54:03.633 回答