2011-08-01 14 views
6

Próbuję zaimplementować komunikację krzyżową między wieloma komputerami i jednym serwerem w tej samej sieci. Teraz próbuję użyć WCF z NetTcpBinding, hostowanego w mojej aplikacji, która działa na tym samym komputerze, ale kiedy próbuję połączyć się z innej maszyny, generuje błąd bezpieczeństwa SSPI.WCF z NetTCP na maszynach w tej samej sieci

Znalazłem wiele przykładów robienia tego na różnych maszynach, ale wszystkie dotyczą pliku app.config, którego NAPRAWDĘ chciałbym uniknąć. Chcę móc osadzić tę funkcjonalność w bibliotece DLL, która nie ma innych zależności (tj. Plików konfiguracyjnych), dla których mogę po prostu przekazać do niej wszystkie niezbędne adresy serwerów itp. I będzie działać. Czy mimo to można skonfigurować to bezpieczeństwo (za pośrednictwem punktów końcowych itp.) Wyłącznie w kodzie?

Jestem testowania to wszystko się z poniższym kodzie:

SERVER:

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

KLIENT:

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

robię coś podobnego do tego jednak zawsze uzyskać wyjątek limit czasu, nawet jeśli funkcja próbuję wywołać tylko ma powrotu linii 1; i ustawić czas wysyłania na 1 godzinę, a jedyna główna różnica polega na tym, że użyłem podstawowego http zamiast tcp. – ZoomVirus

Odpowiedz

5

Zabezpieczenia są zwykle konfigurowane na oprawie. Używasz wartości domyślnej NetTcpBinding, co oznacza, że ​​włączone są zabezpieczenia Transport.

na obu, serwera i klienta, należy przypisać instancję NetTcpBinding do zmiennej lokalnej, dzięki czemu można zmienić ustawienia zabezpieczeń (ewentualnie inne AND), a następnie użyć tej zmiennej podczas wywoływania AddServiceEndpoint lub podczas tworzenia ChannelFactory.

Próbka:

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

+1 Perfect! Właśnie tego szukałem z 'NetNamedPipeBinding' również! –

1

Jest to prawdopodobnie problem z SPN, że usługa jest działa pod. Najprawdopodobniej jest to konto komputera zamiast konta domeny. Jest więcej informacji in this thread.

AKTUALIZACJA: Są tam informacje o programowym ustawianiu SPN, ale jest pochowany kilka kliknięć ... tutaj jest direct link (zobacz ostatnią sekcję strony).

+0

Próbowałem to zadziałać, ale wciąż nie miałem szczęścia ... chociaż chciałbym, żeby to działało w ten sposób. Myślę, że może po prostu nie rozumiem, co używać do identyfikacji DNS. Używają "contoso.com", ale nie wiem, w jaki sposób przekłada się to na moją konfigurację. –

Powiązane problemy