处理找不到针对WebApi的404

时间:2018-09-07 05:19:09

标签: c# asp.net asp.net-web-api

我正在创建

  

Asp.Net MVC + AngularJS

应用程序。在WebApi控制器中,我已经处理了各种异常(500、404等)。另一方面,所有未处理的异常都会被捕获

  

Global.asax.cs

文件的

  

Application_Error

方法。 但是,如果应用程序缺少整个API,则会按预期在浏览器的控制台上显示404错误,但是在这种情况下,我也需要重定向到适当的UI(html / cshtml)。我该如何处理这种类型的异常?

PS 。我尝试使用

  

customErrors

属性

  

Web.config

文件也没有,但是没有用。

2 个答案:

答案 0 :(得分:0)

您需要执行以下步骤,

  1. 创建一个控制器来处理错误
  2. 为该错误控制器配置路由
  3. 使用自定义IHttpControllerSelector处理404错误。
  4. 如果在所选控制器中找不到匹配的操作方法,则将请求传递到上述自定义IHttpControllerSelector。 可以使用自定义IHttpActionSelector进行处理。
  5. 最后,在global.asax.cs文件中注册自定义IHttpControllerSelector和IHttpActionSelector

请遵循由Imran Baloch撰写的This很棒的教程,以获取详细信息

答案 1 :(得分:0)

以下是一些有关如何处理API错误以执行重定向的方法。

使用jQuery.ajaxError()

$(document)
    .ajaxError(function (event, jqXHR, ajaxSettings, thrownError) {
        if (jqXHR.status == 404) {
            window.location.replace("http://www.stackoverflow.com");
        }
    });

使用jQuery.ajaxSetup()

$.ajaxSetup({
    global: true,
    error: function(xhr, status, err) {
        if (xhr.status == 404) {
           window.location.replace("http://www.stackoverflow.com");
        }
    }
});

如果您想以角度的方式使用[Javascript] Global Ajax error handler with AngularJS

$provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {
  return {
    'response': function(response) {
      // do something on success
      return response || $q.when(response);
    },

   'responseError': function(rejection) {
      // do something on error
      if (canRecover(rejection)) {
        return responseOrNewPromise;
      }
      return $q.reject(rejection);
    }
  };
});

$httpProvider.interceptors.push('myHttpInterceptor');

angular.module("globalErrors", ['appStateModule']).factory "myHttpInterceptor", ($q, $log, growl) ->
  response: (response) ->
    $log.debug "success with status #{response.status}"
    response || $q.when response

  responseError: (rejection) ->
    $log.debug "error with status #{rejection.status} and data: #{rejection.data['message']}"
    switch rejection.status
      when 404
        window.location.replace("http://www.stackoverflow.com");
      else
        console.log(rejection.status);

    # do something on error
    $q.reject rejection

.config ($provide, $httpProvider) ->
  $httpProvider.interceptors.push('myHttpInterceptor')

这是基于AngularJS 1.1.4。如果您使用的是其他版本,则可以应用类似的策略。