WCF с NetTCP на машинах в одной сети - PullRequest
6 голосов
/ 02 августа 2011

Я пытаюсь реализовать межпроцессное взаимодействие между несколькими компьютерами и одним сервером в одной сети.Сейчас я пытаюсь использовать WCF с NetTcpBinding, размещенным в моем приложении, которое работает на той же машине, но когда я пытаюсь подключиться с другого компьютера, выдается ошибка безопасности SSPI.

нашел много примеров выполнения этой кросс-машины, но все они включают файл app.config, которого я ДЕЙСТВИТЕЛЬНО хотел бы избежать.Я хочу иметь возможность встроить эту функцию в DLL, которая не имеет других зависимостей (то есть файлов конфигурации), для которых я могу просто передать в нее все необходимые адреса сервера и т. Д., И это будет работать.Есть ли способ настроить эту безопасность (через конечные точки и т. Д.) Исключительно в коде?

Я тестирую все это с помощью приведенного ниже кода:

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

КЛИЕНТ:

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

Ответы [ 2 ]

5 голосов
/ 02 августа 2011

Безопасность обычно настраивается на привязке.Вы используете NetTcpBinding с его настройками по умолчанию, что означает, что защита Transport включена.

На сервере и клиенте вы должны назначить экземпляр NetTcpBinding локальной переменной, чтобы вы могли изменить настройки безопасности (и, возможно, другие), а затем использовать эту переменную при вызове AddServiceEndpointпри создании ChannelFactory.

Образец:

var binding = new NetTcpBinding();
// disable security:
binding.Security.Mode = SecurityMode.None;
1 голос
/ 02 августа 2011

Вероятно, это проблема с именем участника-службы, под которым работает ваша служба.Скорее всего, это учетная запись компьютера, а не учетная запись домена.В этой теме есть больше информации .

ОБНОВЛЕНИЕ: там есть информация о программной настройке SPN, но она скрыта несколькими щелчками ... вот прямая ссылка 1006* (см. последний раздел страницы).

...