我有这些设置:
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搞砸了?
答案 0 :(得分:1)
ServiceStack的路由优先级如下。 ServiceStack调用ServiceStackHttpHandlerFactory.GetHandler
来获取当前路由的处理程序。
ServiceStackHttpHandlerFactory.GetHandler
返回:
GetCatchAllHandlerIfAny(...),
返回的处理程序(如果有)。ServiceStackHttpHandlerFactory.GetHandlerForPathInfo
返回的处理程序(如果有)。 ServiceStackHttpHandlerFactory.GetHandlerForPathInfo
返回:
GetCatchAllHandlerIfAny(...),
返回的处理程序(如果有的话)。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的更多详细信息,请参阅我对相关问题的回答,例如:https://stackoverflow.com/a/17618851/149060