是否可以从Web API构造函数返回响应?

时间:2014-08-13 17:50:26

标签: asp.net-mvc-4 asp.net-web-api

我有一个Web API ApiController基类,我想在构造函数中执行一些验证。这可能包括检查服务器上的当前负载。如果它很高,我想返回一个适当的HttpResponseMessage,表明请求者应该稍后再试。

这样的事情可能吗?

4 个答案:

答案 0 :(得分:0)

即使您正在做的事情听起来像修改方法可能更好。请注意,您可以抛出HttpResponseException,因为WebApi是Rest Service HttpResponseException是将异常重新发送回客户端的推荐方法。

var resp = new HttpResponseMessage(HttpStatusCode.NotFound)
{
   Content = new StringContent("No idea what happened "),
   ReasonPhrase = "Something was not Not Found"
}
throw new HttpResponseException(resp);

答案 1 :(得分:0)

我没有测试过,但这不是构造函数的用途。我不认为当时所有的管道设置都是。

您可以使用全局过滤器来实现此目的。 Here您有一个为授权设置全局过滤器的示例,您应该使用类似的逻辑,但为特定目的创建自己的过滤器。

全局过滤器会拦截您的所有请求,并在控制器操作之前执行,因此是执行任务的好地方。

答案 2 :(得分:0)

只要您使用的是.NET 4.5,那么您最好创建自定义MessageHandler。为了做到这一点,您需要扩展DelegatingHandler

public class MyHandler : DelegatingHandler {
    protected override async Task<HttpResponseMessage> SendAsync(
            HttpMessageRequest request, CancellationToken cancellationToken) {
        // Access the request object, and do your checking in here for things
        // that might cause you to want to return a status before getting to your 
        // Action method.

        // For example...
        return request.CreateResponse(HttpStatusCode.Forbidden);
    }
}

然后在WebApiConfig内,只需添加以下代码即可使用新的处理程序:

config.MessageHandlers.Add(new MyHandler());

答案 3 :(得分:0)

你不能在构造函数中抛出HttpResponseException,这总会导致500.

最简单的方法是覆盖ExecuteAsync():

public override Task<HttpResponseMessage> ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken) {
        if (!myAuthLogicCheck()) {
            // Return 401 not authorized
            var msg = new HttpResponseMessage(HttpStatusCode.Unauthorized) { ReasonPhrase = "User not logged in" };
            throw new HttpResponseException(msg);
        }

        return base.ExecuteAsync(controllerContext, cancellationToken);
}