Uma forma de integrar sistemas distintos de forma assíncrona é usar um serviço de fila. No ASP.NET uma maneira fácil de consumir uma fila é usando MSMQ.

Para instalar o serviço de Message Queue em uma máquina do Windows use o seguinte comando no prompt (mais informações):

ocsetup MSMQ-Container;MSMQ-Server

Para verificar se a instalação ocorreu corretamente, abra o Gerenciamento do Computador (compmgmt.msc) e veja se apareceu o recurso Enfileiramento de Mensagens como na imagem abaixo:

fila02-1

Com o MSMQ configurado. Você pode criar um aplicativo e então consumir a fila. Em um projeto Console do Visual Studio adicione a DLL System.Messaging e adicione também o namespace:

using System.Messaging;

Abaixo algumas funções úteis para interagir com o serviço de fila. Na função Enqueue(…) basta passar o nome da fila desejada, que se ela não existir ela será criada. E em seguida uma mensagem será enfileirada com o conteúdo em string.

public string Enqueue(string topicName, string message)
{
    MessageQueue topic;

    if (MessageQueue.Exists(topicName))
        topic = new MessageQueue(topicName);
    else
        topic = MessageQueue.Create(topicName);

    topic.Formatter = new XmlMessageFormatter(
        new Type[] { typeof(string) });

    Message msg = new Message(message);

    topic.Send(msg);

    return msg.Id;
}

Na função Dequeue(…) informe o nome da fila que uma mensagem será retirada e retornada. O código abaixo possui dois pontos de atenção. A saber:

  1. Observe o comando topic.MessageReadPropertyFilter.SetAll(); que define que as leituras deverão trazer todas as propriedades da mensagem.
  2. A leitura da mensagem feita pelo topic.Receive(…) está recebendo um argumento do tipo TimeSpan de 1 segundo. Pois, quando a fila está vazia e executamos a função topic.Receive(…) sem definir o tempo de espera a função ficará aguardando até a chegada de uma mensagem.
public System.Messaging.Message Dequeue(string topicName)
{
    MessageQueue topic;

    if (MessageQueue.Exists(topicName))
        topic = new MessageQueue(topicName);
    else
        topic = MessageQueue.Create(topicName);

    topic.Formatter = new XmlMessageFormatter(
        new Type[] { typeof(string) });

    topic.MessageReadPropertyFilter.SetAll();

    try
    {
        Message message = topic.Receive(
            TimeSpan.FromSeconds(1), 
            MessageQueueTransactionType.None);

        return message;

    }
    catch (Exception ex)
    {
        return null;
    }
}

Você também pode excluir completamente os dados de uma fila usando o método Purge().

public void Purge(string topicName)
{
    MessageQueue topic;
    if (MessageQueue.Exists(topicName))
        topic = new MessageQueue(topicName);
    else
        topic = MessageQueue.Create(topicName);

    topic.Purge();
}

Atenção: O nome das filas possui um formato específico. Um exemplo de nome seria .\private$\teste01 como na imagem abaixo:

fila01

Algumas formas de usar as funções acima:

//
// Enfileira a mensagem "data" e retorna o ID
//
string id = Enqueue(".\private$\teste01", "data");

//
// Retira o item mais antigo na fila e retorna
//
string newData = Dequeue(".\private$\teste01");

//
// Esvazia a fila
//
Purge(".\private$\teste01");