2011-08-01 31 views
6

複数のコンピュータと同じネットワーク上の1台のサーバー間のクロスプロセス通信を実装しようとしています。私が今しようとしているのは、同じマシンで動作するアプリケーション内でホストされているNetTcpBindingでWCFを使用することですが、別のマシンから接続しようとすると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(); 
     } 
    } 
    } 
} 

が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

私はしかし、私はいつも私だけ呼び出すしよう関数は改行を持っている場合でも、タイムアウト例外を取得し、これに似た何かをやっている-1; sendtimeoutを1時間に設定しておけば、唯一の主な違いは、tcpの代わりに基本的なhttpを使用しています。 – ZoomVirus

答えて

5

通常、セキュリティはバインディングで構成されます。 NetTcpBindingのデフォルト値を使用しています。つまり、Transportセキュリティが有効です。

セキュリティとその他の設定を変更してAddServiceEndpointを呼び出すとき、またはChannelFactoryを作成するときに、NetTcpBindingインスタンスをローカル変数に割り当てる必要があります。

サンプル:

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

+1完璧!私が 'NetNamedPipeBinding'でも探していたものです! –

1

これはおそらく、あなたのサービスがあるSPNの問題です下を走っている。ドメインアカウントではなくマシンアカウントです。詳細情報はin this threadです。

UPDATE:SPNをプログラムによって設定することについての情報がありますが、ここにはdirect linkがあります(ページの最後のセクションを参照)。

+0

これは動作しようとしましたが、まだ運がなかった...私はそれをこのように動作させたいですが。おそらく、私はちょうどDNSのアイデンティティのために何を使うべきか理解できないでしょう。彼らは "contoso.com"を使用しますが、それが私の設定にどのように変換されるかはわかりません。 –

関連する問題