2009-11-12 6 views
8

私は過去2日間WCFで作業していましたが、開発マシン上でサーバーとクライアントの両方がうまくいっていました。これで、ネットワーク上の別のマシン上のクライアントでいくつかの分散テストを実行しようとしています。問題に取り掛かり始めました。今、私は取得していますエラーは次のとおりです。WCFでセキュリティをプログラムでオフにする方法

アクション「http://tempuri.org/IWindowUpdateContract/UpdateWindowFrames」とのメッセージが原因EndpointDispatcherでContractFilterの不一致に、受信機側で処理することはできません。これは、契約の不一致(送信者と受信者の間の不一致)または送信者と受信者の間のバインディング/セキュリティの不一致のいずれかが原因である可能性があります。送信者と受信者が同じ契約と同じバインディング(セキュリティ要件、たとえばメッセージ、トランスポート、なしなど)を持っていることを確認します。

これはすでに大規模な学習経験であるため(私はRPCを以前に行ったことがない)、学習ツールの開発を続け、終了時にセキュリティを再訪したい(私は意図がない適切なセキュリティのベストプラクティスなしに実際に使用されるものを構築すること)。

注:

  • 私は、WCFのための設定ファイルの設定を持っていない - 私はプログラム的にすべてをやっています。
  • 私のネットワークはドメインの一部ではないので、デフォルトのセキュリティ設定はnet.tcpを使って私にとっては機能しませんでした。
  • 私は '.Net 3.5'を使用しています。

    var svh = new ServiceHost(_serviceImplementation); 
    
        var binding = new NetTcpBinding(); 
    
        binding.ReaderQuotas.MaxArrayLength = 2000000; 
        binding.Security.Mode = SecurityMode.None; 
        binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.None; 
        binding.Security.Transport.ProtectionLevel = ProtectionLevel.None; 
        binding.Security.Message.ClientCredentialType = MessageCredentialType.None; 
    
        svh.AddServiceEndpoint(_serviceInterface, binding, string.Format("net.tcp://{0}:{1}", _endPoint.Address, _endPoint.Port)); 
    
        _stopFlag = new AutoResetEvent(false); 
    
        svh.Open(); 
    
        _stopFlag.WaitOne(); 
    

    そして、私のクライアントは、次のように作成されます:

私のサーバーは、このように作成され

var binding = new NetTcpBinding(); 

    binding.ReaderQuotas.MaxArrayLength = 2000000; 
    binding.Security.Mode = SecurityMode.None; 
    binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.None; 
    binding.Security.Transport.ProtectionLevel = ProtectionLevel.None; 
    binding.Security.Message.ClientCredentialType = MessageCredentialType.None; 

    var scf = new ChannelFactory<IUserInputContract>(binding, "net.tcp://192.168.0.42:8001"); 
    _uiUpdateServer = scf.CreateChannel(); 

と同じように追加されたクラスライブラリである私の契約(クライアントとサーバーの両方への参照)は次のとおりです。

[ServiceContract(ProtectionLevel = ProtectionLevel.None)] 
    public interface IWindowUpdateContract { 
     [OperationContract] 
     void UpdateWindowFrames(WindowFrame frame); 
     [OperationContract] 
     void WindowHasClosed(IntPtr hwnd); 
} 

I f私が行った拘束と契約のセットアップは、それらを同一にするべきであり、私はこの問題を抱えてはならない(そして、セキュリティはオフにすべきです)。私はちょうど今どこに行くか分からない。

答えて

10

私はあなたに同意します。サーバーとクライアントの両方のセキュリティ設定が同一であるように見えます。

側の注記:あなたは一度:

binding.Security.Mode = SecurityMode.None; 

私はあなたが以下の「binding.Security」オブジェクトまたは上の任意のより多くの設定を指定する必要はないと思う - これらの余分な行はその後です必要ありません。私の目を引いた何

は、あなたのサービス契約である:

[ServiceContract(ProtectionLevel = ProtectionLevel.None)] 
public interface IWindowUpdateContract 
{ 
    [OperationContract] 
    void UpdateWindowFrames(WindowFrame frame); 
    [OperationContract] 
    void WindowHasClosed(IntPtr hwnd); 
} 

これらの動作は何も返さない - 珍しいです。 WCFサービスのデフォルトの動作は[要求/応答]です。要求を送信して応答を返すことになります。

WCFが何も返さないことを知るように、それらを何か(ステータスや文字列、intのようなもの)を返すようにするか、「片道」呼び出しとしてマークする必要があります。

[ServiceContract(ProtectionLevel = ProtectionLevel.None)] 
public interface IWindowUpdateContract 
{ 
    [OperationContract(IsOneWay=true)] 
    void UpdateWindowFrames(WindowFrame frame); 
    [OperationContract(IsOneWay=true)] 
    void WindowHasClosed(IntPtr hwnd); 
} 

マルク・

+0

私は「IsOneWay」属性を追加しようと、私はまた、あなたが言及した1行に結合コードを削減し、物事が今取り組んでいます。あなたに助けてくれてありがとう!これらの2つの事のどちらかがその特定のエラーを引き起こす可能性があるのはちょっと奇妙なことがわかります...しかし、私は何も変えなかったし、今は動作します! – InvertedAcceleration

+0

@curiouscoder:私はそれがIsOneWay =真の設定だと思うでしょう。 –

関連する問題