是否有可能恢复从Web API构造一个回应?(Is it possible to return a

2019-10-29 17:11发布

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

是这样的可能吗?

Answer 1:

我没有测试它,但事实并非构造是什么。 我不认为所有的管道被设置在那个时候。

您可以使用全局过滤器用于此目的。 在这里你能够设置全局过滤器授权的样本,你应该使用类似的逻辑,但针对特定目的创建自己的过滤器。

全局过滤器会拦截所有请求和之前的控制器动作,就是为了完成你的任务的好地方执行。



Answer 2:

即使你在做什么听起来像它可能是更好的修改办法。 请注意,您可以抛出HttpResponseException以来WebApi是REST服务HttpResponseException是抛出异常返回给客户端的推荐方式。

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


Answer 3:

只要你使用.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());


Answer 4:

你不能扔在构造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);
}


文章来源: Is it possible to return a response from a Web API constructor?