\

Školení Návrhové vzory, OOP a UML


 Tuesday, 28 March 2006
Další FAQ k .NET Remotingu
  1. Při použití CAO (Client Activated) objektu nebo při vrácení MarshalByRefObjectu ze SAO (Server Activated) objektu fungují volání metod jen v lokální síti. Na počítači přistupujícím přes internet (a komunikujícím tedy většinou přes adresu firewallu/routeru) volání metody vzdáleného CAO objektu vždy selže.

    Důvodem je, že každý CAO objekt je identifikován unikátním dynamickým URI, které je vygenerováno na serveru. Server za firewallem/routerem ale vrátí název počítače nebo IP adresu (v závislosti na nastavení vlastnosti useIpAddress u přenosového kanálu), které jsou platné pouze v lokální síti. Nastavením vlastnosti machineName u kanálu můžeme zadat, jaký název serveru (IP adresa) mají být v URI pro CAO objekty vráceny - zadáme tedy externí a pro klienty viditelnou adresu (např. adresu firewallu).

    V Konfiguračním souboru

    <channel ref="tcp" machineName="serverExternalVisibleName">
    </channel>

    V kódu:
    IDictionary properties = new Hashtable();
    properties["machineName"] = "serverExternalVisibleName";
    TcpChannel tcpChannel = new TcpChannel(properties, null, null);
    ChannelServices.RegisterChannel(tcpChannel);
  2. Při komunikaci se serverovým objektem dostanete hlášení, že selhalo přihlášení k proxy (The remote server returned an error: (407) Proxy Authentication Required).

    Net Remoting podporuje přihlášení k webovému serveru, ale jeho autoři trestuhodně a pravděpodobně omylem (ale i ve verzi 2.0?) nezveřejnili pro zadání přihlašovacích údajů objekt IWebProxy. Jediným nepříliš čistým řešením (pomineme-li nespolehlivé zadání autentizačních údajů přes třídu GlobalProxySelection) je použití reflection a nastavení privátního člena _proxyObject v objektu HttpClientChannel.

    //Vytvoření nového http komunikačního kanálu
    HttpChannel channel = new HttpChannel();
    
    //Získáme deskriptor člena _clientChannel (klientský http kanál) ve třídě HttpChannel
    FieldInfo clientChannelFO = typeof(HttpChannel).GetField("_clientChannel",   BindingFlags.Instance|BindingFlags.NonPublic);
    
    //Získání instance HttpClientChannel
    HttpClientChannel clientChannel = clientChannelFO.GetValue(channel);
    
    //Získání deskriptoru proxy objektu
    FieldInfo proxyObject = typeof(HttpClientChannel).GetField("_proxyObject", BindingFlags.Instance | BindingFlags.NonPublic);
    
    //Vytvoření nového proxy objektu
    IWebProxy authProxy = new WebProxy("proxy", 80); 
    
    //Pro autentizaci k proxy použijeme údaje přihlášeného uživatele
    authProxy.UseDefaultCredentials = true;
    
    //Nastavení nové proxy v objektu HttpClientChannel
    proxyObject.SetValue( clientChannel, proxy );
    

Starší FAQ k .NET Remotingu na tomto blogu

Dva nejčastější dotazy k .NET Remotingu
Dotazy a odpovědi k .NET Remotingu



Monday, 27 March 2006 23:47:11 (Central Europe Standard Time, UTC+01:00)       
Comments [0]  .NET Framework | .Net Remoting