“不支持http方法”时WebApi的自定义异常

时间:2014-10-23 09:20:48

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

我有一个简单的控制器:

   public class UsersController : ApiController
    {
        [HttpPost]
        [AllowAnonymous]
         public HttpResponseMessage Login([FromBody] UserLogin userLogin)
         {
             var userId = UserCleaner.Login(userLogin.MasterEntity, userLogin.UserName, userLogin.Password, userLogin.Ua);
             if (userId == null) return Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "User not authorized");
             return Request.CreateResponse(HttpStatusCode.OK, Functions.RequestSet(userId)); 

         }
   }

如您所见,目前只有POST可用。

但是当我在浏览器中调用GET时(仅用于检查):

  

http://royipc.com:88/api/users

我明白了:

  

{“Message”:“请求的资源不支持http方法   'GET'。“}

我很清楚为什么会这样。但是我希望在它发生时返回一个自定义异常。

SO的其他答案并没有说明我如何处理这种情况(不管我发现了什么)

问题

我应该如何(以及在​​哪里)捕获这种情况并返回自定义异常(HttpResponseMessage)?

NB

我不想为“catch and throw”添加一个虚拟GET方法。明天可以有一个GET方法。我只是想抓住这个例外并返回我的自己!

2 个答案:

答案 0 :(得分:3)

您可能需要继承ApiControllerActionSelector类,这是Web API用于选择所需操作的内容。

然后你可以用你的新动作选择器替换默认的IHttpActionSelector。 config.Services.Replace(typeof(IHttpActionSelector), new MyActionSelector());

检查此网址以获取完整示例:http://www.strathweb.com/2013/01/magical-web-api-action-selector-http-verb-and-action-name-dispatching-in-a-single-controller/

答案 1 :(得分:0)

您可以在ASP.Net WebAPI中构建自定义异常过滤器。异常过滤器是实现IExceptionFilter接口的类。要创建自定义异常过滤器,您可以自己实现IExceptionFilter接口,也可以创建一个继承自内置ExceptionFilterAttribute类的类。在后面的方法中,您需要做的就是覆盖OnException()方法并插入一些自定义实现。

public class MyExceptionFilter:ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext context)
    {
        HttpResponseMessage msg = new HttpResponseMessage(HttpStatusCode.InternalServerError)
        {
            Content = new StringContent("An unhandled exception was thrown by the Web API controller."),
            ReasonPhrase = "An unhandled exception was thrown by the Web API controller."
        };
        context.Response = msg;
    }
}

您可能希望测试条件并生成确切的异常,但这只是一个例子。

要使用异常类,您可以在Global.asax中注册它,也可以将其作为特定类或方法的属性注册。

public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        GlobalConfiguration.Configuration.Filters.Add(new WebAPIExceptionsDemo.MyExceptionFilter());
        AreaRegistration.RegisterAllAreas();
        ...
    }
}

[MyExceptionFilter]
public class UsersController : ApiController
{
...
}