2011-09-11 3 views
0

J'ai un service Windows qui expose un service WCF.Comment définir des autorisations pour un service Windows WCF?

J'ai aussi une application qui parle au service WCF et envoie des commandes et reçoit des données.

Tout cela fonctionne correctement lorsque j'exécute l'application à partir de Visual Studio. Toutefois, lorsque j'installe l'application et l'exécute, l'application ne peut pas communiquer avec le service.

Les fichiers batch que l'application exécute ne peuvent pas non plus arrêter et démarrer le service.

J'ai essayé d'utiliser netsh pour « réserve » l'URI, mais je ne sais pas vraiment ce que je fais :-)

Pouvez-vous me diriger dans la bonne direction?

Windows Server Code WCF Code de service (abrégé):

// NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "WCF_Service" in both code and config file together. 
[ServiceContract] 
public class InternetGauge_IO 
{ 

    [OperationContract] 
    public void Pause() 
    { 
     RunningState.paused = true; 
    } 

    [OperationContract] 
    public void Continue() 
    { 
     RunningState.paused = false; 
    } 

    [OperationContract] 
    public bool GetRunningState() 
    { 
     return RunningState.paused; 
    } 
    .... 

code de Windows Server WCF Créer un code endpoint:

 private void InitializeConsoleComms() 
    { 
     try 
     { 
      //Prepare comms with the Console application 
      Type serviceType = typeof(InternetGauge_IO); 
      host = new ServiceHost(serviceType, new Uri[] { new Uri("http://localhost:8080/") }); 

      // Add behavior for our MEX endpoint 
      ServiceMetadataBehavior behavior = new ServiceMetadataBehavior(); 
      behavior.HttpGetEnabled = true; 
      host.Description.Behaviors.Add(behavior); 

      // Create basicHttpBinding endpoint at http://localhost:8080/RJB.InternetGauge/ 
      host.AddServiceEndpoint(serviceType, new BasicHttpBinding(), "RJB.InternetGauge"); 

      // Add MEX endpoint at http://localhost:8080/MEX/ 
      host.AddServiceEndpoint(typeof(IMetadataExchange), new BasicHttpBinding(), "MEX"); 

      host.Open(); 
      logger.LogEvent("Console comms ready", "Internet Gauge", 4, 1); 
     } 
     catch (Exception e) 
     { 
      logger.LogEvent("Failed to open Console comms", "Internet Gauge", 1, 1); 
      logger.LogEvent("Exception : " + e.InnerException + " Stack Trace: " + e.StackTrace + " Message: " + e.Message, "RJB.InternetGauge.WindowsService.Main", 1, 1); 
     } 
    } 

L'application utilise simplement le proxy généré et les méthodes par exemple

private bool GetRunningState() 
    { 
     try 
     {   
      InternetGauge_IOClient client = new InternetGauge_IOClient(); 
      isRunning = true; 
      return(client.GetRunningState()); 
     } 
     catch (Exception) 
     { 
      trayIcon.Text = "Internet Gauge Windows Service does not appear to be running."; 
      trayIcon.Icon = RJB.InternetGauge.Console.Properties.Resources.ServiceStopped; 
      isPaused = true; 
      isRunning = false; 

      return isPaused; 
     } 
    } 

La commande netsh j'ai essayé

netsh http add urlacl url=http://+:8080/InternetGauge_IO user=PC-01\richard 

Toutes les idées?

Merci Richard

+4

Quelle erreur obtenez-vous? –

+0

En outre, s'il vous plaît voir http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be-removed-from-posts –

+0

À quel moment le InitializeConsoleComms est-il appelé? Il doit être appelé lorsque votre service démarre, c'est-à-dire OnStart(). Est-il possible que la raison pour laquelle cela fonctionne dans le débogage est parce que Visual Studio héberge votre service WCF au lieu du service Windows? –

Répondre

1

Il est parce que je suis un crétin.

N'a pas copié le fichier app.config au cours du programme d'installation.

Tout fonctionne bien maintenant.

Questions connexes