Услугата не може да прочете съобщения от опашката след преместване на нова машина

Тази услуга на 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