2011-08-01 26 views
6

我试图在同一网络上的多台计算机和一台服务器之间实现一些跨进程通信。我现在正在尝试的是将WCF与NetTcpBinding一起使用,托管在我的应用程序中,该应用程序在同一台机器上工作,但是当我尝试从另一台机器连接时,它会引发SSPI安全错误。WCF与NetTCP跨机器在同一网络上

我发现了很多跨机器的例子,但都涉及到一个我真想避免的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)); 
     } 
    } 
    } 
} 
+0

我在做一些与此类似,但是我总能得到哪怕我只尝试调用函数有行返回-1超时异常;并将sendtimeout设置为1小时,唯一的主要区别是我已经使用基本的http而不是tcp关于我可能需要做的任何想法。 – ZoomVirus

回答

5

通常在绑定上配置安全性。您正在使用NetTcpBinding及其默认值,这意味着启用了Transport安全性。

在这两个,服务器和客户端,你应该NetTcpBinding实例分配给一个局部变量,这样就可以更改安全性(可能还有其他)设置,然后调用AddServiceEndpoint或创建ChannelFactory时,当使用该变量。

样品:

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

+1完美!就是我在用'NetNamedPipeBinding'寻找的东西! –

1

这可能是与SPN的问题,你的服务是

我出去与下面的代码测试这一切跑下。这很可能是一台机器帐户,而不是一个域帐户。有更多的信息in this thread

更新:在那里有关于以编程方式设置SPN的信息,但是它埋入了几个点击...这里是一个direct link(请参阅页面的最后一节)。

+0

试图让这个工作,但仍然没有运气......虽然我想使它的工作方式。我想也许我只是不明白如何使用DNS身份。他们使用“contoso.com”,但不知道如何转换为我的设置。 –