2011-08-01 7 views
6

Estoy tratando de implementar algunas comunicaciones de proceso cruzado que se encuentran entre varias computadoras y un servidor en la misma red. Lo que intento ahora es usar WCF con NetTcpBinding, alojado en mi aplicación que funciona en la misma máquina, pero cuando intento conectarme desde otra máquina, arroja un error de seguridad de SSPI.WCF Con NetTCP en todas las máquinas en la misma red

He encontrado muchos ejemplos de hacer esta combinación de máquinas cruzadas, pero todas involucran un archivo app.config que REALMENTE quisiera evitar. Quiero poder incrustar esta funcionalidad en una DLL que no tenga otras dependencias (es decir, archivos de configuración) para las cuales puedo pasar todas las direcciones de servidor necesarias, etc., y funcionará. ¿Hay alguna forma de configurar esta seguridad (a través de los puntos finales, etc.) puramente en código?

estoy probando todo esto con el código de abajo:

SERVIDOR:

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(); 
     } 
    } 
    } 
} 

CLIENTE:

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

estoy haciendo algo similar a esto, sin embargo siempre me dan una excepción de tiempo de espera incluso si la función Trato de llamar sólo tiene la línea de retorno de -1; y tiene el tiempo de envío establecido en 1 hora, la única diferencia principal es que he usado http básico en lugar de tcp, cualquier idea sobre lo que pueda necesitar hacer. – ZoomVirus

Respuesta

5

La seguridad normalmente se configura en el enlace. Está utilizando NetTcpBinding con sus valores predeterminados, lo que significa que la seguridad Transport está habilitada.

Por tanto, el servidor y el cliente, debe asignar la instancia NetTcpBinding a una variable local para que pueda cambiar la seguridad (y posiblemente otros) los ajustes, y luego usar esa variable al llamar AddServiceEndpoint o al crear la ChannelFactory.

muestra:

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

+1 Perfecto! Justo lo que estaba buscando con 'NetNamedPipeBinding' también! –

1

Esto es probablemente un problema con el SPN que su servicio es corriendo debajo Es muy probable que sea una cuenta de máquina en lugar de una cuenta de dominio. Hay más información in this thread.

ACTUALIZACIÓN: hay información sobre cómo configurar el SPN programáticamente, pero está enterrado unos pocos clics en ... aquí está un direct link (consulte la última sección de la página).

+0

Intenté hacer funcionar esto, pero todavía no tuve suerte ... aunque me gustaría que funcione de esta manera. Supongo que quizás no entiendo qué usar para la identidad del DNS. Usan "contoso.com" pero no están seguros de cómo se traduce en mi configuración. –

Cuestiones relacionadas