我已经阅读了大量关于使用新的ASP.NET 5处理404错误的文章,但我仍然不确定如何设置以下场景:

  • 让Web API控制器返回404错误,可能在响应正文中使用自定义消息,例如“无法找到指定的拼写ID” .

  • 所有其他404错误保留当前url,返回404状态代码,并显示MVC错误视图或静态html文件的内容(不关心哪个) .

  • 允许IIS处理静态文件而不是ASP.NET(这种情况使事情变得复杂,因为这意味着我们不能放置一个包罗万象的路由或一个包罗万象的中间件来阻止所有请求进入IIS) .

这是不起作用的示例:

在Startup.cs中配置方法:

app.UseErrorHandler("/error");
app.UseStatusCodePagesWithReExecute("/error/{0}");
app.UseMvc(...);

在web.config中:

<httpErrors errorMode="Custom" existingResponse="Replace">
  <remove statusCode="404"/>
  <error statusCode="404" path="/error/404" responseMode="ExecuteURL" />
  <remove statusCode="500"/>
  <error statusCode="500" path="/error" responseMode="ExecuteURL" />
</httpErrors>

一个非常基本的测试控制器:

[Route("api/blah")]
public class BlahController : Controller
{
    // GET: spell/12345
    [HttpGet("[action]/{id}")]
    public IActionResult Spell(int id)
    {
        if (id != 12345)
            return new HttpNotFoundObjectResult(new { Message = "not there bro" });

        return new ObjectResult(new SpellJson
        {
            Id = id,
            Name = "test"
        });
    }
}

我在IIS Express中运行 .

Here's what happens: 1.如果我浏览一个不存在的网址,如http://localhost:49858/asdf,我会看到my / error / 404视图生成的html,太棒了!

  • 如果我从javascript调用/ api / blah / 12345,我会得到我的JSON数据,太棒了!

  • 如果我从javascript调用/ api / blah / 999,我收到404错误但响应正文是由/ error / 404生成的html而不是JSON {Message:“not there bro”},糟糕!

哪个部分使我的控制器显式返回HttpNotFoundObjectResult而不是执行错误页面?如何设置允许Web API控制器方法返回404而不进入错误页面,但是在错误页面中捕获所有其他404错误?