我正在使用带有kestrel的servicestack Core。我使用以下代码创建了CatchAllHandlers
委托。
var requestType = typeof(NotFoundPage);
var restPath = new RestPath(requestType, pathInfo);
return new RestHandler { RestPath = restPath, RequestName = restPath.RequestType.GetOperationName(), ResponseContentType = contentType };
但问题是我的ServicestackApi现在不再可用,url:/ json / reply / GetApiCall转到404找不到的页面。
有没有办法解决这个问题?我可以检查它是否是api电话,还是我可以稍后进入管道来处理请求?
我发现如果删除CatchAllHandler
并添加下一个中间件,则会调用此中间件:
app.Use((context, next) =>
{
context.Response.Body.Write("yaayaya");
return Task.CompletedTask;
});
但这不是我想要的,我想留在servicestack请求中。
查看源代码,我发现HttpHandlerFactory
有一个属性NotFoundHttpHandler
,它是从AppHost中填充的。
CustomErrorHttpHandlers.Add(HttpStatusCode.NotFound, new PageNotFoundHandler());
唯一的缺点是,我无法向此Urlhandler提供任何请求特定信息,例如网址:
public class PageNotFoundHandler : RestHandler
{
public PageNotFoundHandler()
{
var restPath = new RestPath(typeof(Error404), "/Url/For?");
}
}
尝试使这项工作成功但我仍然坚持我的RestHandler具有与url不同的组件数量,因为这个PageNotFoundHandler是在RestHandler之前制作的。
但基本上我正在寻找的是处理不同的服务/ InputDto
我已尝试RequestConverters
,但CatchAllHandlers
未返回处理程序时未达到此代码。所以我卡在中间的这个空间。无论如何,我可以让剩下的所有路线,路由到一个Dto?
答案 0 :(得分:3)
.NET Core的新管道编程模型希望您调用下一个中间件,如果它尚未被任何先前注册的中间件处理,那么.NET Core可以让您将多个不同的中间件组合到一起相同的应用程序。
注册的最后一个中间件将能够处理任何未处理的请求,例如,如果您想为未处理的请求返回静态图像,您可以在ServiceStack之后注册中间件,例如:
app.UseServiceStack(new AppHost());
app.Use(new StaticFileHandler("wwwroot/img/404.png"));
或者如果您想要返回自定义404页面:
app.Use(new RazorHandler("/404"));
这将使用ServiceStack's MVC Razor Views呈现/wwwroot/404.cshtml
Razor视图。
这将是处理.NET Core中未找到请求的首选方法,您可以在ServiceStack之后注册其他中间件来处理非ServiceStack请求。
如果您想为任何未处理的请求调用ServiceStack服务,您可以使用符合任何请求的Fallback Route,例如:
[FallbackRoute("/{Path*}")]
public class Error404
{
public string Path { get; set; }
}
public class UnhandledRequestService : Service
{
public object Any(Error404 request) => ...;
}