限制asp.net请求执行时间

时间:2014-07-18 14:43:01

标签: asp.net performance iis

我有ASP.NET 4处理程序,必须响应少于50毫秒。在某些情况下,例如呼叫远程服务,它会挂起更长的时间。

是否有可能杀死(可能在IIS中)超过50毫秒的此类请求?

每秒约有1000个请求,如果我用超时将每个请求包装在单独的任务中,那么iis工作进程队列会极快地增加并挂起所有系统。它发生在iisrestart之后或者我们有很多超时服务的时候。

UPD:这是处理来自其他服务(服务器)的请求的API处理程序

UPD2:我已经在单独的任务中尝试了包裹请求,但是在每秒有很多请求的时候没有工作。即使使用threadpool

,创建单独的任务也太昂贵了

TimeoutFunctionWrapper:

public static T Execute<T>(Func<T> func, int timeout)
{
    object sync = new object();
    bool isCompleted = false;

    WaitCallback watcher = obj => {
        Thread watchedThread = obj as Thread;

        lock (sync)
        {
            if (!isCompleted)
            {
                Monitor.Wait(sync, timeout);
            }
        }

        if (!isCompleted)
        {
            watchedThread.Abort();
        }
    };

    try
    {
        ThreadPool.QueueUserWorkItem(watcher, Thread.CurrentThread);
        return func();
    }
    catch (ThreadAbortException)
    {
        // This is our own exception.
        Thread.ResetAbort();
        return default(T);
    }
    finally
    {
        lock (sync)
        {
            isCompleted = true;
            Monitor.Pulse(sync);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您必须实现自己的超时机制。启动计时器并在50ms后取消所有未完成的工作。

Cancellation must be cooperative in .NET.没有其他现实的方法来取消工作。

可以取消对外部服务的请求。如何执行此操作取决于您使用的特定API。