Служба не может читать сообщения из очереди после перехода на новую машину

Эта служба Windows читает электронную почту из MSMQ. Он читал почту при развертывании на Windows Server 2003. После переноса на Windows Server 2008 он перестал читать электронную почту. Он не записывает никаких журналов в файл. При запуске службы Windows ничего не происходит.

Пожалуйста, кто-нибудь может сказать мне, что может быть не так. Нужно ли настраивать/изменять какие-либо значения реестра в Windows Server 2008?

Вот соответствующий метод, при котором ведение журнала НЕ происходит:

    public void OnStart()
   // protected override void OnStart(string[] args)        
    {
        string queuePath = ConfigurationManager.AppSettings["mqPath"];
        mailFrom = ConfigurationManager.AppSettings["notificationemail"];
        string SMTPSSLConfig = ConfigurationManager.AppSettings["smtpclientssl"];

        if (string.IsNullOrEmpty(queuePath))
        {
            throw new Exception("Message queue path not defined in app.config.");
        }
        if (string.IsNullOrEmpty(mailFrom))
        {
            throw new Exception("Sender email used to send  notifications is not defined in app.config.");
        }
        if (string.IsNullOrEmpty(SMTPSSLConfig))
        {
            throw new Exception("SMTP SSL config not defined in app.config.");
        }
        objSmtpClient = new SmtpClient();
        objSmtpClient.EnableSsl = Convert.ToBoolean(SMTPSSLConfig);

        //QueueService.InsureQueueExists(queuePath);
        msgQ = new MessageQueue(queuePath);
        msgQ.Formatter = new BinaryMessageFormatter();
        msgQ.MessageReadPropertyFilter.SetAll();
        msgQ.ReceiveCompleted += new ReceiveCompletedEventHandler(msgQ_ReceiveCompleted);
        msgQ.BeginReceive();
        try
        {
            if (!MessageQueue.Exists(queuePath))
            {
                MessageQueue.Create(queuePath);
                Log.WriteMessageQueueInitialParamsLog(System.DateTime.Now.ToString()+" :Message queue successfully created at following location:"+queuePath);
            }
            else
            {
                Log.WriteMessageQueueInitialParamsLog(System.DateTime.Now.ToString() + ": Message Queue Path: " + msgQ.Path);
            }                
        }
        catch (Exception ex)
        {
            Log.WriteCommonLog(System.DateTime.Now.ToString() + " :Error checking message queue existence:\n"+GetExceptionMessageString(ex));   
        }

        //eventLog1.WriteEntry(System.DateTime.Now.ToString()+" :EmailService started successfully." );
        Log.WriteMessageQueueInitialParamsLog(System.DateTime.Now.ToString()+" :Message queue started successfully.");

    }       

Полный код на http://pastebin.com/aiECMTVL


person jiwan    schedule 28.09.2010    source источник


Ответы (1)


Рассмотрите возможность небольшого рефакторинга вашего OnStart(), чтобы сделать его немного чище. Вы можете вводить операторы регистрации перед КАЖДЫМ оператором, чтобы знать, где что-то идет не так.

Рассмотрите возможность рефакторинга методов Log, чтобы ВСЕГДА вставлялась текущая метка времени, чтобы не повторяться везде в коде.

Обновление: если вы не можете заставить его работать, удалите ВСЕ и используйте только один оператор журнала:

protected override void OnStart(string[] args)
{
   Log.Log("In OnStart");
}

Затем добавьте свой код с большим количеством журналов.

public void OnStart()        
{
    Log.Write("OnStart");

    if (ValidateConfigSettings(out queuePath, out mailFrom, out SMTPSSLConfig))
    { 
        Log.Write("Validated config");
        msgQ = SetupMessageQueue(queuePath);
        Log.Write("Set up the queue obj.");
        msgQ.BeginReceive();
        Log.Write("Begun queue receive.");
        try
        {
            if (!MessageQueue.Exists(queuePath))
            {
                MessageQueue.Create(queuePath);
                Log.Log("Message queue successfully created following location:" + queuePath);
            }
            else                   
                Log.Log("Message Queue Path: " + msgQ.Path);                    
        }
        catch (Exception ex)              
            Log.WriteCommonLog("Error checking message queue existence:\n" + GetExceptionMessageString(ex));                
    }
    else
        Log.Write("Found bad config.");

    Log.Log("Message queue started successfully.");
} 
person p.campbell    schedule 28.09.2010
comment
Это снова не сработало в Windows Server 2008, но отлично работает в Windows Server 2003. Но спасибо за предложение рефакторинга OnStart(), чтобы сделать его немного чище. - person jiwan; 29.09.2010
comment
Хорошо, наконец, я нашел решение, это были проблемы с безопасностью. После отладки службы я обнаружил, что очереди сообщений не было предоставлено полное разрешение. после предоставления очереди сообщений полного разрешения служба начала отправлять почту. - person jiwan; 05.10.2010
comment
@jiwan: хороший материал. Возможно, обновите свой вопрос своими выводами, чтобы другие могли найти эту информацию позже! - person p.campbell; 05.10.2010
comment
@jiwan: я тоже столкнулся с той же проблемой. не могли бы вы сообщить им, какие права доступа вы назначили очереди сообщений, чтобы это работало? - person kawade; 16.06.2015