2016-12-09 14 views
2

Вот мой сценарий. У меня есть служба Windows, которая запускает задачу каждые 20 минут, задача: запрос обновлений из API, размещенного на удаленном веб-сайте.Передача данных из Windows Service в консольное приложение повторно

Ответ представляет собой список объектов JSON. Когда Служба получает список, он выполняет набор операций, затем добавляет больше объектов JSON, и, наконец, служба должна выталкивать список в запущенное консольное приложение.

Мой очень конкретный вопрос, является: как передать эти данные из службы окон в консоли App как непосредственно и профессионально

По непосредственно я имею в виду без промежуточного решения как письма в файле temp или сохранении в таблице SQL ... и т.д.

От профессионально Я имею в виду лучших оптимальное решение, особенно без p/Invoke из сервиса в консольное приложение.

ответ

1

Вам понадобится среда для общения между этими двумя процессами. Связь может быть выполнена многими способами в одной и той же системе.

С вашим объяснением в вопросе это похоже на одностороннее общение. Возможно, вы можете пойти для межпроцессного взаимодействия через сокеты (исходный уровень) или использовать среду обмена сообщениями для связи (WCF/SignalR), или вы даже можете использовать систему очереди сообщений (MSMQ/RabbitMQ) и т. Д.

Вы можете получите конкретный ответ, если вы можете сузить свой вопрос.

+0

Ваш комментарий чрезвычайно полезен, мне нравится идея RabbitMQ ... только маленький вопрос ... это управляет строковыми каплими? или только двоичный? – Alrehamy

0

Приятным, чистым, «современным» способом сделать это будет размещение веб-API непосредственно в консольном приложении и принятие ввода JSON.

Это относительно легко настроить и очень легко проверить и использовать.

Другие методы включают .NET remoting (который уже не очень современный), некоторые другие виды услуг, такие как WCF или любое из множества методов IPC для Windows.

+0

Я не могу изменить архитектуру, приложение консоли также выполнение задач по расписанию, Спасибо за ваш ответ – Alrehamy

+0

@doe_deo Если вы не можете внести какие-либо изменения в консольное приложение, то почему вы задаете вопрос? 0.o – gnud

+0

Я не могу вносить изменения в архитектуру, а не в консольное приложение – Alrehamy

0

Я написал ответ here, который имеет некоторый код. В принципе, OP там хотели отправить строки из приложения Windows Forms в консольное приложение и приложить консольное приложение строки.

Моя рекомендация - использовать очередь сообщений.

Несколько быстрых заметок: во-первых, вам может понадобиться enable the feature in Windows, если вы этого никогда не делали. Кроме того, я думаю, что при определенных настройках Windows вы не можете создать очередь сообщений непосредственно из C#; если это так, вы можете создать его вручную (или, вероятно, есть способ сделать это как часть установочного скрипта или что-то еще).

Вот для Windows Forms Код:

private void button1_Click(object sender, EventArgs e) 
{ 
    // Or whatever name you end up calling it if you created the queue manually 
    const string myQueue = ".\\myQueue"; 

    // It's possible that this won't work on certain computers 
    // If not, you'll have to create the queue manually 
    // You'll also need to turn the Message Queueing feature on in Windows 
    // See the following for instructions (for Windows 7 and 8): https://technet.microsoft.com/en-us/library/cc730960(v=ws.11).aspx 
    if (!MessageQueue.Exists(myQueue)) 
    { 
     MessageQueue.Create(myQueue); 
    } 

    using (MessageQueue queue = new MessageQueue(myQueue)) 
    { 
     queue.Formatter = new XmlMessageFormatter(new[] { typeof(string) }); 
     queue.Send("Test"); 
    } 
} 

Консоли приложения:

static void Main(string[] args) 
{ 
    // Or whatever name you use 
    const string myQueue = ".\\myQueue"; 

    // See my comment on the corresponding line in the Windows Forms application 
    if (!MessageQueue.Exists(myQueue)) 
    { 
     MessageQueue.Create(myQueue); 
    } 

    MessageQueue queue = new MessageQueue(myQueue); 
    queue.Formatter = new XmlMessageFormatter(new[] { typeof(string) }); 

    while (true) 
    { 
     Message message = queue.Receive(); 
     string messageText = message.Body.ToString(); 

     // Close if we received a message to do so 
     if (messageText.Trim().ToLower() == "exit") 
     { 
      break; 
     } 
     else 
     { 
      Console.WriteLine(messageText); 
     } 
    } 
} 
+1

Благодарим вас за подробный ответ, кажется, что RabbitMQ - это именно то, что мне нужно, я сохраню ваш ответ для будущего ref. снова большое спасибо – Alrehamy

 Смежные вопросы

  • Нет связанных вопросов^_^