在 Asp.net Web API 中捕获 404 错误

Posted

技术标签:

【中文标题】在 Asp.net Web API 中捕获 404 错误【英文标题】:Catch 404 errors in Asp.net Web API 【发布时间】:2013-12-04 14:11:29 【问题描述】:

我正在尝试捕获由 Asp.net Web API 服务器返回的 404 错误。

但是,来自 Global.asax 内部的Application_Error 并没有捕捉到它们。

有没有办法处理这些错误?

【问题讨论】:

你想通过这个实现什么目标? 我试图向用户返回友好的错误消息,而不是返回 IIS html 页面。 (该项目只能使用带有 JSON 或 XML 响应的 API 调用来请求) 您是否可以完全控制ApiControllers 的代码? 【参考方案1】:

您可能想看看Handling HTTP 404 Error in ASP.NET Web API,它有一个分步示例

【讨论】:

感谢您提供的精彩链接。我昨天正在为我的 Web API 项目寻找类似的东西,但不知何故它没有出现在我的搜索结果中。 这是一个很好的链接,谢谢。不幸的是,它不会捕获所有 404 错误。例如,输入localhost:34123/xxyyzz 不会被捕获。 不幸的是,由于使用了属性路由,我无法完成这项工作。【参考方案2】:

我知道这是旧的,但我也只是在寻找它,并找到了一种似乎可行的非常简单的方法,所以我想添加以防万一这可以帮助其他人。

我找到的适合我的解决方案是here。此外,这可以与属性路由(我使用的)混合使用。

所以,在我的 (Owin) Startup 课程中,我只需添加类似...的内容。

public void Configuration(IAppBuilder app)
      
     HttpConfiguration httpConfig = new HttpConfiguration();   
     //.. other config

     app.UseWebApi(httpConfig);

     //...
     // The I added this to the end as suggested in the linked post
     httpConfig.Routes.MapHttpRoute(
       name: "ResourceNotFound",
         routeTemplate: "*uri",
         defaults: new  controller = "Default", uri = RouteParameter.Optional );
    // ...

 

  // Add the controller and any verbs we want to trap
  public class DefaultController : ApiController
  
      public IHttpActionResult Get(string uri)
            
      return this.NotFound();
      

      public HttpResponseMessage Post(string uri)
             
        HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.NotFound, "I am not found");
        return response;
       
       

然后您可以在上面返回任何错误对象(在此示例中,我只是为我的 POST 返回一个字符串“我找不到”。

我按照@Catalin 的建议尝试了xxyyzz(没有命名控制器前缀),效果也很好。

【讨论】:

以上是关于在 Asp.net Web API 中捕获 404 错误的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 4,Web API - 404 未找到

Asp.Net Web API 阻止 404 页面上的任意文本

所有 ASP.NET Web API 控制器都返回 404

请求用户电子邮件时返回 404 Not Found [ASP.NET Web API]

第二个API上的ASP.Net Web API 404错误

ASP.NET Web API 应用程序在 IIS 7 上部署时提供 404