Подтвердить что ты не робот

Как создать службу прослушивателя С# для MSMQ как службы Windows

Начну с того, что я не .NET-разработчик, но был брошен в проект, где мне нужно использовать MSMQ, чтобы классическое веб-приложение ASP могло отправлять сообщения службе С# Windows, которая обрабатывает обработку. У меня есть опыт интеграции других очередей сообщений с другими языками, но, как я уже упоминал, у меня нет большого опыта разработки .NET и Windows, поэтому некоторые рекомендации будут высоко оценены.

Вот мои вопросы...

  • Может ли кто-нибудь предоставить базовый код С#, который прослушивает существующую очередь MSMQ и отвечает на новое сообщение, делая что-то простое, например, записывая текущую временную метку в файл журнала или отправляя электронное письмо?

  • Как мне упаковать этот код в Visual Studio.NET для создания и установки службы Windows? (Какой тип проекта должен быть и т.д. Я использую Visual С# 2010 Express.)

  • Наконец, я не уверен, какую версию и/или реализацию MSMQ я должен использовать для своих требований с классическим ASP. Я думаю, что версия COM - это то, что мне нужно, но я также прочитал о новой версии WCF, а также о различиях между 3.0 и 4.0. Может кто-нибудь, пожалуйста, дайте мне направление, по какой версии я должен использовать?

Большое спасибо!

4b9b3361

Ответ 1

Вы можете ждать сообщения в заданной очереди, используя следующий код (вы хотите использовать приватную очередь с именем SomeQueue на вашем компьютере с именем ComputerName = > QueueName = @ "ComputerName\private $\ SomeQueue" )

    public void AsyncWatchQueue(object encapsulatedQueueName)
    {
        Message newMessage;
        MessageQueue queue;

        string queueName = encapsulatedQueueName as string;
        if (queueName == null)
            return;

        try
        {
            if (!MessageQueue.Exists(queueName))
                MessageQueue.Create(queueName);
            else
            {
                queue = new MessageQueue(queueName);

                if (queue.CanRead)
                    newMessage = queue.Receive();
            }
            HandleNewMessage(newMessage); // Do something with the message
        }
        // This exception is raised when the Abort method 
        // (in the thread instance) is called
        catch (ThreadAbortException e) 
        {
            //Do thread shutdown
        }
        finally
        {
            queue.Dispose();
        }
    }

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

изменить: добавлен код для реализации многопоточной части (и переименован в указанную выше подпись метода)

Код создания темы:

        public Thread AddWatchingThread(string QueueName)
    {
        Thread Watcher = 
            new Thread(new ParameterizedThreadStart(AsyncWatchQueue));
        Watcher.Start(QueueName);
        // The thread instance is used to manipulate (or shutdown the thread)
        return Watcher; 
    }

Я просто хочу отметить, что это непроверенная треска, это просто быстрый пример

Ответ 2

Насколько я знаю, Visual Studio Express не имеет шаблона проекта для службы. Это не значит, что вы не можете написать службу Windows с VSE, просто у вас не будет шаблона, чтобы вы начали.

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

using System.ServiceProcess;

namespace WindowsService1
{
  public partial class Service1 : ServiceBase
  {
    public Service1()
    {
      InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
    }

    protected override void OnStop()
    {
    }
  }
}

Затем код запуска службы может войти в функцию Main вашей службы.

using System.ServiceProcess;

namespace WindowsService1
{
  static class Program
  {
    static void Main()
    {
      ServiceBase[] ServicesToRun;
      ServicesToRun = new ServiceBase[] 
            { 
                new Service1() 
            };
      ServiceBase.Run(ServicesToRun);
    }
  }
}

Это должно дать вам базовые рамки для вашего сервиса. Другая вещь, которая вам понадобится, - добавить установщика для службы, чтобы он мог быть установлен как служба. Следующее должно начать вас, обратите внимание, что я заметил, что это провело.

using System.ComponentModel;
using System.Configuration.Install;
using System.ServiceProcess;

namespace WindowsService1
{
  [RunInstaller(true)]
  public class ProjectInstaller : Installer
  {
    private ServiceProcessInstaller serviceProcessInstaller1;
    private ServiceInstaller serviceInstaller1;

    public ProjectInstaller()
    {
      this.serviceProcessInstaller1 = new ServiceProcessInstaller();
      this.serviceInstaller1 = new ServiceInstaller();

      this.serviceProcessInstaller1.Password = null;
      this.serviceProcessInstaller1.Username = null;

      this.serviceInstaller1.ServiceName = "Service1";

      this.Installers.AddRange(new System.Configuration.Install.Installer[] {
        this.serviceProcessInstaller1,
        this.serviceInstaller1});
    }
  }
}

Учитывая вышеизложенное, вам должно быть достаточно, чтобы искать или запрашивать дополнительную информацию о создании службы. Что касается слушателя MSMQ, вы можете использовать следующую статью MSDN в качестве отправной точки

http://msdn.microsoft.com/en-us/library/ms978425.aspx