路径不存在时的ServiceStack Razor行为

时间:2013-07-15 07:56:31

标签: razor servicestack

我有这些设置:

    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。但是,它不会在文件夹下执行此操作。

告诉你。

EDIT ---------------------------------------------- --------

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

我的设置有误? SS搞砸了?

1 个答案:

答案 0 :(得分:1)

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

ServiceStackHttpHandlerFactory.GetHandler返回:

  1. 匹配的RawHttpHandler,如果有的话。
  2. 如果是域根,则GetCatchAllHandlerIfAny(...),返回的处理程序(如果有)。
  3. 如果路线与元数据uri匹配,则为相关处理程序(如果有)。
  4. ServiceStackHttpHandlerFactory.GetHandlerForPathInfo返回的处理程序(如果有)。
  5. NotFoundHandler。
  6. ServiceStackHttpHandlerFactory.GetHandlerForPathInfo返回:

    1. 如果url匹配有效的REST路由,则使用新的RestHandler。
    2. 如果网址与现有文件或目录匹配,则返回
      • GetCatchAllHandlerIfAny(...),返回的处理程序(如果有的话)。
      • 如果它是受支持的文件类型,则为StaticFileHandler,
      • 如果它不是受支持的文件类型,则为ForbiddenHttpHandler。
    3. GetCatchAllHandlerIfAny(...),返回的处理程序(如果有)。
    4. 空。
    5. 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