我有一个Web API ApiController基类,我想在构造函数中执行一些验证。这可能包括检查服务器上的当前负载。如果它很高,我想返回一个适当的HttpResponseMessage,表明请求者应该稍后再试。
这样的事情可能吗?
答案 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);
}