我有一个简单的控制器:
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时(仅用于检查):
我明白了:
{“Message”:“请求的资源不支持http方法 'GET'。“}
我很清楚为什么会这样。但是我希望在它发生时返回一个自定义异常。
SO的其他答案并没有说明我如何处理这种情况(不管我发现了什么)
问题
我应该如何(以及在哪里)捕获这种情况并返回自定义异常(HttpResponseMessage)?
NB
我不想为“catch and throw”添加一个虚拟GET方法。明天可以有一个GET方法。我只是想抓住这个例外并返回我的自己!
答案 0 :(得分:3)
您可能需要继承ApiControllerActionSelector类,这是Web API用于选择所需操作的内容。
然后你可以用你的新动作选择器替换默认的IHttpActionSelector。 config.Services.Replace(typeof(IHttpActionSelector), new MyActionSelector());
答案 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
{
...
}