Продолжайте обработку после возврата ответа клиенту - PullRequest
4 голосов
/ 09 июня 2011

У меня есть страница общего обработчика (.ashx), которая получает XML-документ от ведущего поставщика. Затем я беру этот документ XML и отправляю его третьему лицу для подписки. Я жду ответа от третьей стороны, а затем передаю этот ответ ведущему поставщику. Все это происходит за 30 секунд или меньше.

Моя проблема в том, что ведущий провайдер будет ждать не более 30 секунд, прежде чем закрыть соединение и двигаться дальше. Я пытаюсь запустить внутренний таймер, и если я не получил ответ от стороннего страховщика, все равно отправьте ответ ведущему провайдеру. Это все отлично работает.

Что я хочу сделать, так это отправить ответ обратно ведущему поставщику, но продолжить ждать ответа стороннего страховщика. Они доставят его нам ... но иногда это может занять пару минут.

Я пробовал все виды комбинаций

Response.Flush();
Response.Close();
Response.End();
context.ApplicationInstance.CompleteRequest();

Все, что мне удалось сделать, это а) выдать ошибку об отмене потока или «Невозможно оценить выражение, потому что код оптимизирован или собственный фрейм находится над стеком вызовов», или b ) клиент считает, что запрос был только что завершен, и он так и не получил ответ.

Я не могу реализовать архитектуру типа очереди, не переработав большую часть логики, и даже тогда я не хочу этого делать, потому что это увеличит время обработки ответа.

Есть предложения? Похоже, что .Close () и .End () не предназначены для того, чтобы функционировать так, как я думаю, и я не могу понять, что следует использовать вместо этого.

1 Ответ

3 голосов
/ 09 июня 2011

Может System.Threading.ThreadPool.QueueUserWorkitem () может вам помочь?

Идея состоит в том, чтобы поставить в очередь операцию, которая будет выполняться всякий раз, когда поток свободен в пуле потоков.

public class Data {
    public int ID {get; set; }
    public string OtherData { get; set; }    
}

public override void ProcessRequest(HttpContext context)
{
    var workLoad = new Data {
        ID = int.Parse(context.Request.Params["ID"]),
        OtherData = context.Request.Params["OtherData"]
    };
    // somewhere before the end :
    ThreadPool.QueueUserWorkItem(new WaitCallback(LongRunningMethod), workLoad);

    Response.Flush();
    Response.Close();
}

public void LongRunningMethod(object state) 
{
    var data = (Data)state;
    CalculateTheOriginOfTheLife(data.ID, data.OtherData);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...