我有一个Web API ApiController基类,我想在构造函数中执行一些验证。 这可能包括检查服务器上的当前负载。 如果它是高,我想返回适当HttpResponseMessage指示请求后应该再次尝试。
是这样的可能吗?
我有一个Web API ApiController基类,我想在构造函数中执行一些验证。 这可能包括检查服务器上的当前负载。 如果它是高,我想返回适当HttpResponseMessage指示请求后应该再次尝试。
是这样的可能吗?
我没有测试它,但事实并非构造是什么。 我不认为所有的管道被设置在那个时候。
您可以使用全局过滤器用于此目的。 在这里你能够设置全局过滤器授权的样本,你应该使用类似的逻辑,但针对特定目的创建自己的过滤器。
全局过滤器会拦截所有请求和之前的控制器动作,就是为了完成你的任务的好地方执行。
即使你在做什么听起来像它可能是更好的修改办法。 请注意,您可以抛出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);
只要你使用.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());
你不能扔在构造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);
}