2010-05-12 113 views
7

.NET Remoting ile ilgili garip bir sorun yaşıyoruz. Temelde, biz ChannelServices.RegisterChannel() iki TcpChannels kaydeden bir sunucu var: . NET Kanalları kendi başlarına çevirmeyi deneyin.

  1. Bir bağlantı noktasını dinleyen

    Diğer bir bağlantı noktasını dinleyen 50000
  2. 15000.
Sonra bir TcpChannel kaydeder Müvekkilin

sunucu ile iletişim kurabilir. Biz URI

ile Activator.GetObject() arayarak sunucudan bir nesneyi almak "tcp: // serverip: 50000/objectname"

ve düzgün çalıştığı, istemci bağlantı noktasında sunucuya bağlanır 50000 ve nesneyi alır. Biz o nesne üzerinde yöntemleri çağırmadan başladığınızda

Ancak, port 50000 üzerinde kanala bağlantı bırakıldığında ve yeni bir bağlantı otomatik olarak liman 15000 üzerinde kanala yapılır. Bu, 15000 numaralı bağlantı noktasında trafiği istemediğimizden bizim için gerçek bir sorun teşkil ediyor çünkü bu kanal, sunucudaki bağlantı noktası 50000 kanalıyla aynı ağ bağdaştırıcısına bağlı olmayabilir veya bu bağlantı noktası güvenlik duvarında açık olmayabilir. Remoting doğal olarak başarısızlık çağrıları. İstemci bağlantı noktası 15000 veya hangi IP onu dinler üzerinde sunucudaki başka bir kanal var olduğu bizim kodunda hiçbir bilgiye sahip, henüz kendisine bağlanmaya çalışırsanız beri

Bu bizim için çok garip.

IDictionary props = new Hashtable(); 

props["port"] = m_tcpPort; 
props["name"] = String.Empty; 


BinaryServerFormatterSinkProvider serverProvider = new BinaryServerFormatterSinkProvider(); 
serverProvider.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full; 

BinaryClientFormatterSinkProvider clientProvider = new BinaryClientFormatterSinkProvider(); 

m_tcpChannel = new TcpServerChannel(props, /*clientProvider,*/ serverProvider); 
ChannelServices.RegisterChannel(m_tcpChannel, false); 

m_wellKnownObjRef = RemotingServices.Marshal(this, "[email protected]" + m_tcpPort.ToString()); 
:

Bu herhangi bir Yardım büyük takdir,

Teşekkür, Casper

Bu sunucu kanallarından biri, genellikle port 50000 üzerinde bir tane kurar koddur

Bu, genellikle 15000:

IDictionary props = new Hashtable(); 

props["name"] = String.Empty; 
props["port"] = ip.Port; 
props["bindTo"] = ip.Address.ToString();      
props["timeout"] = REMOTING_TIMEOUT; // Timeout to prevent hung remoting calls. 

if (!String.IsNullOrEmpty(machineName)) 
{ 
    props["machineName"] = machineName; 
} 

    BinaryServerFormatterSinkProvider serverProvider = new BinaryServerFormatterSinkProvider(); 
    serverProvider.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full; 

    BinaryClientFormatterSinkProvider clientProvider = new BinaryClientFormatterSinkProvider(); 

    m_channel = new TcpChannel(props, clientProvider, serverProvider); 
    ChannelServices.RegisterChannel(m_channel, false); 

    m_objRef = RemotingServices.Marshal(this, QueueName); // Queuename is a GUID. 
numaralı bağlantı noktasında diğer sunucu kanalını kuran koddur.

Bu, ilk sunucu kanalına bağlanan istemci kod, port 50000 genellikle var biridir:

IDictionary props = new Hashtable(); 

props["port"] = 0; 

RemotingConfiguration.CustomErrorsMode = CustomErrorsModes.Off; 

BinaryServerFormatterSinkProvider serverProvider = new BinaryServerFormatterSinkProvider(); 
serverProvider.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full; 

BinaryClientFormatterSinkProvider clientProvider = new BinaryClientFormatterSinkProvider(); 

m_tcpChannel = new TcpClientChannel(props, clientProvider/*, serverProvider*/); 
ChannelServices.RegisterChannel(m_tcpChannel, false); 

string address = "tcp://" + profile.RemoteIP + ":" + profile.RemoteTCP; 

m_server = (Kernel)Activator.GetObject(typeof(Server), address + "/[email protected]" + port); 
+0

App.config dosyasında herhangi bir kanal yapılandırmanız varsa, bunu sorunuza ekleyin. –

+0

Yanıtladığınız için teşekkür ederiz. Koddaki tüm kurulumlar için app.config yapılandırması yoktur. Bu koda şu soruyu ekledim. – Casper

cevap

7

Biz bu ve görünüşe göre, biz burada ne yapıyoruz .NET Remoting tarafından desteklenmemektedir hakkında Microsoft ile bir destek vakası giriş yaptıktan. Her bir türe ait bir kanalı yalnızca bir Uygulama Alanında kaydettirebilirsiniz. Remoting'in yaptığı şey, nesnenin URI'sini, söz konusu nesneye nereden erişebileceğini söylemek için istemciye geri göndermesidir. Bunu yaparken, sunucu tarafında kayıtlı kanallara bakar ve orada bulduğu türle eşleşen ilk kanalı kullanır (bizim durumumuzda: Tcp). Diğer bir deyişle, ilk önce hangi kanalın kaydedileceğini kullanır. Müşterinin hangi kanalda bağlı olduğu hiç umursamıyor.

çözüm istemci tarafında kendi IClientChannelSinkProvider uygulamaktır. CreateSink() yöntemini uygularken, kullanılacak lavaboyu oluştururken istemcinin bağlanmasını istediğiniz URL'yi seçebilirsiniz.

+0

Açıklama için teşekkürler! Birden fazla NIC için kanal oluştururken sunucumuzun her zaman düzgün yanıt vermemesinin nedenini uzun zamandır arıyorduk. Sebebi ve çözümü anlattığın gibi. – Philippe

0
O stuggle vermedi

portları yanı "backlinked"; Sadece sunucunun bir şeyleri geri göndermek istediği zaman ortaya çıkacağını düşündüm (bir olay-prosedüründe bile). Her zaman güvenlik duvarlarıyla ilgili sorun yaşadığım için GenuineChannels'a geçtim (bunun biraz modası geçmiş olduğunu düşünüyorum).

+0

Remoting'in kendisi artık modası geçmiş, WCF ile değiştirildi. –

+0

Gerçekten de öyle. .NET Framework 1.0'ın yeni çıktığı zaman, sorun yaşadığımız kod yazıldı. Müşterilerimizden biri, iki kanalı farklı ağ bağdaştırıcılarına bağlamaya çalışıncaya kadar, bu yıl hiç kimse bu sorunu fark etmedi. – Casper