我有一个Nancy Fx应用程序,它充当一个纯API端点(仅限application/json,没有文本/ html或浏览器等访问)和一个返回例如以下内容的模块:
return
userExists
? Negotiate.WithStatusCode(HttpStatusCode.OK)
: Negotiate.WithStatusCode(HttpStatusCode.NotFound);
Run Code Online (Sandbox Code Playgroud)
但是,我注意到一个特殊性 - 客户端将Accept-Header设置为'application/json'并在此处执行GET请求,确实得到文本/ html响应,更糟糕的是 - 在.NotFound情况下是Nancy特定的/返回自己的404错误,如果是.OK,则由于缺少视图而发生异常.
让我更奇怪的是,在我的自定义IStatusCodeHandler中,我"看到"context.Response 是一个JsonResponse,在管道的某个地方,它被处理并(试图)以某种方式进一步转换为text/html,而且我想知道为什么.
有什么方法可以阻止转换为text/html吗?
这是因为Nancy有一个DefaultStatusCodeHandler处理500和404响应.这是在主机接管响应之前在Nancy管道中运行的最后一件事.
你所看到的是因为处理程序获得了一个404响应(尽管是一个JsonResponse),并且它无法知道它是一个硬盘(一条路线根本就不存在)还是一个软盘(一条路线存在但已经返回404)的状态码,所以它将其转换为默认404页面.您可能会认为它应该在执行此操作之前检查接受标头,但现在它不是.
如果您不想要此行为,可以通过覆盖InternalConfiguration引导程序中的属性来删除默认状态代码处理程序:
protected override NancyInternalConfiguration InternalConfiguration
{
get
{
return NancyInternalConfiguration
.WithOverrides(config => config.StatusCodeHandlers.Clear());
}
}
Run Code Online (Sandbox Code Playgroud)