2011-08-01 3 views
6

Je suis en train de mettre en œuvre une communication de processus transversale qui est entre plusieurs ordinateurs et un serveur sur le même réseau. Ce que j'essaie actuellement est d'utiliser WCF avec NetTcpBinding, hébergé dans mon application qui fonctionne sur la même machine, mais quand j'essaye de me connecter à partir d'une autre machine, il lance une erreur de sécurité SSPI.WCF Avec NetTcp entre toutes les machines sur le même réseau

J'ai trouvé beaucoup d'exemples de faire cette croix-machine, mais ont tous en commun un fichier app.config que je voudrais vraiment éviter. Je veux être en mesure d'intégrer cette fonctionnalité dans une DLL qui n'a pas d'autres dépendances (c'est-à-dire des fichiers de configuration) pour laquelle je peux simplement passer toutes les adresses de serveur nécessaires, etc. et cela fonctionnera. Est-il possible de configurer cette sécurité (via les terminaux, etc.) uniquement en code?

Je teste tout cela avec le code ci-dessous:

SERVEUR:

using System; 
using System.ServiceModel; 

namespace WCFServer 
{ 
    [ServiceContract] 
    public interface IStringReverser 
    { 
    [OperationContract] 
    string ReverseString(string value); 
    } 

    public class StringReverser : IStringReverser 
    { 
    public string ReverseString(string value) 
    { 
     char[] retVal = value.ToCharArray(); 
     int idx = 0; 
     for (int i = value.Length - 1; i >= 0; i--) 
     retVal[idx++] = value[i]; 

     string result = new string(retVal); 
     Console.WriteLine(value + " -> " + result); 
     return result; 
    } 
    } 

    class Program 
    { 
    static void Main(string[] args) 
    { 
     var uri = "net.tcp://" + System.Net.Dns.GetHostName() + ":9985"; 
     Console.WriteLine("Opening connection on: " + uri); 

     using (ServiceHost host = new ServiceHost(
     typeof(StringReverser), 
     new Uri[]{ 
      new Uri("net.tcp://" + System.Net.Dns.GetHostName() + ":9985") 
     })) 
     { 
     host.AddServiceEndpoint(typeof(IStringReverser), 
      new NetTcpBinding(), 
      "TcpReverse"); 

     host.Open(); 

     Console.WriteLine("Service is available. " + 
      "Press <ENTER> to exit."); 
     Console.ReadLine(); 

     host.Close(); 
     } 
    } 
    } 
} 

CLIENT:

using System; 
using System.ServiceModel; 
using System.ServiceModel.Channels; 

namespace WCFClient 
{ 
    [ServiceContract] 
    public interface IStringReverser 
    { 
    [OperationContract] 
    string ReverseString(string value); 
    } 

    class Program 
    { 
    static void Main(string[] args) 
    { 
     var ep = "net.tcp://SERVER:9985/TcpReverse"; 
     ChannelFactory<IStringReverser> pipeFactory = 
     new ChannelFactory<IStringReverser>(
      new NetTcpBinding(), 
      new EndpointAddress(
      ep)); 

     IStringReverser pipeProxy = 
     pipeFactory.CreateChannel(); 

     Console.WriteLine("Connected to: " + ep); 
     while (true) 
     { 
     string str = Console.ReadLine(); 
     Console.WriteLine("pipe: " + 
      pipeProxy.ReverseString(str)); 
     } 
    } 
    } 
} 
+0

que je fais quelque chose de semblable à ce que je reçois cependant toujours une exception de délai d'attente, même si la fonction que j'essaie de n'appeler a le retour de la ligne 1; et avoir le sendtimeout mis à 1 heure la seule différence principale est que j'ai utilisé base http au lieu de tcp des idées sur ce que je dois faire. – ZoomVirus

Répondre

5

La sécurité est normalement configurée sur la liaison. Vous utilisez NetTcpBinding avec ses valeurs par défaut, ce qui signifie que la sécurité Transport est activée.

Sur les deux, serveur et client, vous devez assigner l'instance NetTcpBinding à une variable locale de sorte que vous pouvez modifier la sécurité (et éventuellement d'autres) les paramètres, et ensuite utiliser cette variable lors de l'appel AddServiceEndpoint ou lors de la création du ChannelFactory.

Exemple:

var binding = new NetTcpBinding(); 
// disable security: 
binding.Security.Mode = SecurityMode.None; 
+0

+1 Parfait! Juste ce que je cherchais avec 'NetNamedPipeBinding' aussi bien! –

1

Ceci est probablement un problème avec le SPN que votre service est courir sous. Il s'agit probablement d'un compte machine au lieu d'un compte de domaine. Il y a plus d'informations in this thread. MISE À JOUR: Il existe des informations sur la définition du SPN par programme, mais il est enterré quelques clics dans ... voici un direct link (voir la dernière section de la page).

+0

J'ai essayé de faire fonctionner cela mais je n'avais toujours pas de chance ... mais j'aimerais le faire fonctionner de cette façon. Je suppose que je ne comprends tout simplement pas ce qu'il faut utiliser pour l'identité DNS. Ils utilisent "contoso.com" mais ne savent pas comment cela se traduit par ma configuration. –

Questions connexes