2009-12-10 4 views
0

Je tente d'héberger un service WCF, en utilisant NetTcpBinding dans un service Windows. (Je vais l'utiliser comme une API pour divers clients à la fois Web et Windows32) Évidemment, je le fais dans un hôte de test avant de le mettre dans un service Windows.WCF: auto-hôte un service NetTcp, ne résout pas

Je le contrat suivant:

namespace yyy.xxx.Server.API.WCF 
{ 
    [ServiceContract] 
    public interface ISecureSessionBroker 
    { 
     [OperationContract] 
     string GetSessionToken(string username, string encryptedPassword, string clientApiKey, string clientAddress); 
    } 
} 

avec la mise en œuvre suivante:

namespace yyy.xxx.Server.API.WCF 
{ 
    public class SecureSessionBroker : ISecureSessionBroker 
    { 
     #region ~ from ISecureSessionBroker ~ 

     public string GetSessionToken(string username, string encryptedPassword, string clientApiKey, string clientAddress) 
     { 
      return Guid.NewGuid().ToString(); 
     } 

     #endregion 
    } 
} 

Je héberge le service WCF en utilisant le code ci-dessous (dans une classe/méthode):

try 
{ 
    _secureSessionBrokerHost = new ServiceHost(typeof(SecureSessionBroker)); 
    NetTcpBinding netTcpBinding = new NetTcpBinding(); 
    _secureSessionBrokerHost.AddServiceEndpoint(typeof(ISecureSessionBroker), netTcpBinding, "net.tcp://localhost:8080/secureSessionBrokerTcp"); 
    int newLimit = _secureSessionBrokerHost.IncrementManualFlowControlLimit(100); 
    // Open the ServiceHost to start listening for messages. 
    _secureSessionBrokerHost.Open(); 

} 
catch (Exception ex) 
{ 
throw; 
} 

L'élément clé ici est que je ne veux pas avoir à compter sur un fichier App.config. Tout doit être configuré par programme. Quand j'exécute ce code, le service semble "monter" et écouter. (.-À-dire que je n'ai pas exception)

mais quand j'utilise le code client ci-dessous:

string secureSessionBrokerUrl = string.Format("{0}/secureSessionBrokerTcp","net.tcp://localhost/8080",url); 
EndpointAddress endpointAddress=new EndpointAddress(secureSessionBrokerUrl); 
System.ServiceModel.Channels.Binding binding = new NetTcpBinding(); 
yyy.xxx.Windows.AdminTool.API.WCF.SecureSessions.SecureSessionBrokerClient 
    client = new yyy.xxx.Windows.AdminTool.API.WCF.SecureSessions.SecureSessionBrokerClient(binding,endpointAddress); 
string sessionToken=client.GetSessionToken("", "", ""); // exception here 
MessageBox.Show(sessionToken); 

... Je reçois toujours une exception. En ce moment, je reçois:

Cette opération de requête envoyée à net.tcp: // localhost: 8080/secureSessionBrokerTcp n'a pas reçu une réponse dans le délai configuré (0:01:00). Le temps alloué à cette opération peut ont été une partie d'un délai d'expiration plus long . Cela peut être dû au fait que le service continue de traiter l'opération ou parce que le service était incapable d'envoyer un message de réponse. S'il vous plaît envisager d'augmenter le délai d'attente de fonctionnement (par coulée du canal/proxy à IContextChannel et définissant la propriété OperationTimeout) et veiller à ce que le service est en mesure de se connecter au client.

Donc je suppose qu'il ne peut pas résoudre le service.

Où est-ce que je me trompe? Comment tester l'existence du service sur TCP? J'ai utilisé le SvcTraceViewer et je reçois juste le même message, donc pas de nouvelles là-bas.

Je préférerais demander à l'utilisateur une URL du service, donc ils entreraient "net.tcp: // localhost: 8080" ou quelque chose, qui serait alors utilisé comme BaseAddress pour les divers appels à la SecureSessionBroker (et autres) services WCF ... sans recourir à App.config.

Malheureusement, tous les exemples que je peux trouver tous utilisent App.config.

Fait intéressant, je peux héberger le service en utilisant l'hôte VS et le client se connecte très bien. (À l'aide: D: \ dev2008 \ xxx \ yyy.xxx.Server> WcfSvcHost.exe/service:. Bin/debug/yyy xxx.Server.dll /config:App.config)

Répondre

1

Ok, il est venu à moi dans un éclair d'inspiration. J'utilisais un Windows Form (sonnerie d'alarme) pour "héberger" le service.En cliquant sur le formulaire, j'ai utilisé un peu de code pour appeler le service (inclus) sur un clic de bouton. Bien sûr, le service n'était pas dans son propre thread, donc le service n'a pas pu répondre.

Je l'ai fixé en mettant le récipient de service (qui contient l'hôte) dans son propre thread:

Thread thread = new Thread(new ThreadStart(_serviceWrapper.Start)); 
thread.Start(); 

La méthode Start() met en place le ServiceHost. Je pensais à tort que si un hôte de service WCF créait des threads pour les requêtes entrantes, il ne le ferait que s'il se trouvait dans son propre thread non bloquant (c'est-à-dire pas un thread UI).

Espérons que cela aide quelqu'un d'autre.

+0

Acceptez votre propre réponse pour l'enlever de la pile de questions sans réponse. – nitzmahone

+0

Merci, nitzamahone, j'avais juste besoin d'attendre les 48 heures. :) –

+0

5 heures supplémentaires ... –

Questions connexes