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)
Acceptez votre propre réponse pour l'enlever de la pile de questions sans réponse. – nitzmahone
Merci, nitzamahone, j'avais juste besoin d'attendre les 48 heures. :) –
5 heures supplémentaires ... –