Servicestack显示404页面CatchAllHandlers

时间:2017-03-17 10:51:33

标签: servicestack

我正在使用带有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请求中。

更新2

查看源代码,我发现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?

1 个答案:

答案 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服务

如果您想为任何未处理的请求调用ServiceStack服务,您可以使用符合任何请求的Fallback Route,例如:

[FallbackRoute("/{Path*}")]
public class Error404
{
    public string Path { get; set; }
}

public class UnhandledRequestService : Service
{
    public object Any(Error404 request) => ...;
}