2010-04-13 9 views
1

Avoir un service Windows qui écoute un msmq. Dans la méthode OnStart est cetteMessageQueue.BeginReceive() erreur de référence null - C#

protected override void OnStart(string[] args) 
{ 
    try 
    { 
     _queue = new MessageQueue(_qPath);//this part works as i had logging before and afer this call 

     //Add MSMQ Event 
     _queue.ReceiveCompleted += new ReceiveCompletedEventHandler(queue_ReceiveCompleted);//this part works as i had logging before and afer this call 

     _queue.BeginReceive();//This is where it is failing - get a null reference exception 
    } 
    catch(Exception ex) 
    { 
     EventLogger.LogEvent(EventSource, EventLogType, "OnStart" + _lineFeed + 
      ex.InnerException.ToString() + _lineFeed + ex.Message.ToString()); 
    } 
} 

private MessageQueue _queue = null; 

Cela fonctionne sur ma machine, mais lorsqu'il est déployé sur un serveur Windows 2003 et en cours d'exécution en tant que compte de service réseau, il ne

Exception recvd :

Service cannot be started. System.NullReferenceException: Object reference not set to an instance of an object. 
at MYService.Service.OnStart(String[] args) 
at System.ServiceProcess.ServiceBase.ServiceQueuedMainCallback(Object state) 

Résolu: Problème avéré que le Q que j'ai mis en place, je devais explicitement ajouter le compte de service réseau sous l'onglet de sécurité

+1

S'il vous plaît publier le contenu du 'Exception', y compris la trace de la pile. –

Répondre

2

Vous voyez que exception particulière parce que vous appelez ex.InnerException.ToString(). La propriété InnerException n'est pas toujours remplie (en fait, il est fréquent que ne soit pas et ne devrait pas l'être).

Votre problème racine est susceptible que le compte de service réseau ne dispose pas d'autorisations pour accéder à la file d'attente (dans ce cas, lire à partir de lui).

est ici un code qui vous aidera à obtenir l'erreur réelle dans votre journal des événements:

catch(Exception ex) 
{ 
    Exception e = ex; 
    StringBuilder message = new StringBuilder(); 

    while(e != null) 
    { 
     if(message.Length > 0) message.AppendLine("\nInnerException:"); 

     message.AppendLine(e.ToString()); 

     e = e.InnerException; 
    } 

    EventLogger.LogEvent(EventSource, EventLogType, "OnStart" + _lineFeed + 
     message.ToString()); 
} 
Questions connexes