我想为我的AsyncController设置一个可配置的超时值。我知道我们可以用[AsyncTimeout(5000)]
属性修饰一个方法,并且还可以将该值与const变量一起使用。我想使用一个静态变量,以便在编译后可以有一种更可配置的方式来设置超时。
读取此AsyncManager似乎有一个可以设置的属性,称为超时。
这是我尝试过的。
[HttpPost]
public void DoWorkAsync(MyQuery query)
{
AsyncManager.Timeout = TestTimeout; //TestTimeout is a static int set to 120000
AsyncManager.OutstandingOperations.Increment();
(do work)...
}
似乎未使用AsyncManager.Timeout值,而是在默认的45秒后抛出TimeoutException。
有没有办法在编译时设置此超时值?
最佳答案
您可以像这样创建从AsyncTimeoutAttribute
派生的类
public class CustomAsyncTimeoutAttribute : AsyncTimeoutAttribute
{
public CustomAsyncTimeoutAttribute() : base(Params.TimeOut)
{}
}
其中
Params.Timeout
包含您的静态超时变量。或者,您可以尝试以下操作(只需复制/粘贴基本的
AsyncTimeout
功能):public class CustomAsyncTimeoutAttribute : AsyncTimeoutAttribute
{
public CustomAsyncTimeoutAttribute() : base(0)
{}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext == null)
throw new ArgumentNullException("filterContext");
var managerContainer = filterContext.Controller as IAsyncManagerContainer;
if (managerContainer == null)
throw new InvalidOperationException("The operation has timed out.");
managerContainer.AsyncManager.Timeout = //There you can get your timeout parameter from resourse (i.e. config file, database, etc);
base.OnActionExecuting(filterContext);
}
}
另外,您应该用
async
键盘标记动作方法,方法应该返回Task
或Task<T>
,并且方法的最后一个参数应该是CancellationToken
,否则AsyncTimeout
不起作用。例如:
[CustomAsyncTimeoutAttribute]
public async Task PerformAction(/*Some parameters*/, CancellationToken token)