servicestack,Razor,servicestack" /> servicestack,Razor,servicestack" />

路径不存在时的ServiceStack Razor行为';不存在

路径不存在时的ServiceStack Razor行为';不存在,razor,servicestack,Razor,servicestack,我有以下设置: CustomHttpHandlers = { {HttpStatusCode.NotFound, new RazorHandler("/notfound")}, {HttpStatusCode.Unauthorized, new RazorHandler("/unauthorized")}, } 当我访问/stars文件夹中不存在的内容时: /stars/asdf/xyz 它首先检查/stars/asdf/default.csht

我有以下设置:

    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

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

这是根目录下的行为:

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

谢谢你

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

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


我的设置错了吗?SS Glicted?

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

ServiceStackHttpHandlerFactory.GetHandler
返回:

  • 匹配的RawHttpHandler(如果有)
  • 如果是域根,则由
    GetCatchAllHandlerIfAny(…),
    返回的处理程序(如果有)
  • 如果路由与元数据uri匹配,则为相关处理程序(如果有)
  • ServiceStackHttpHandlerFactory.GetHandlerForPathInfo
    返回的处理程序(如果有)
  • NotFoundHandler
    ServiceStackHttpHandlerFactory.GetHandlerForPathInfo
    返回:

  • 如果url与有效的REST路由匹配,则会创建一个新的RestHandler
  • 如果url与现有文件或目录匹配,则返回
    • GetCatchAllHandlerIfAny(…),
      返回的处理程序(如果有)
    • 如果它是受支持的文件类型,则为StaticFileHandler
    • 如果它不是受支持的文件类型,则禁用HttpHandler
  • GetCatchAllHandlerIfAny(…),
    返回的处理程序(如果有)
  • 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的更多详细信息,请参见我对一个相关问题的回答:

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

    ServiceStackHttpHandlerFactory.GetHandler
    返回:

  • 匹配的RawHttpHandler(如果有)
  • 如果是域根,则由
    GetCatchAllHandlerIfAny(…),
    返回的处理程序(如果有)
  • 如果路由与元数据uri匹配,则为相关处理程序(如果有)
  • ServiceStackHttpHandlerFactory.GetHandlerForPathInfo
    返回的处理程序(如果有)
  • NotFoundHandler
    ServiceStackHttpHandlerFactory.GetHandlerForPathInfo
    返回:

  • 如果url与有效的REST路由匹配,则会创建一个新的RestHandler
  • 如果url与现有文件或目录匹配,则返回
    • GetCatchAllHandlerIfAny(…),
      返回的处理程序(如果有)
    • 如果它是受支持的文件类型,则为StaticFileHandler
    • 如果它不是受支持的文件类型,则禁用HttpHandler
  • GetCatchAllHandlerIfAny(…),
    返回的处理程序(如果有)
  • 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的更多详细信息,请参见我对相关问题的回答,如下所示: