Quantcast
Viewing all articles
Browse latest Browse all 10

How to Use .Net Remoting Using C#

 The information in this article help to:
  • What is .NET Remoting?
  • .NET Remoting Architecture?
  • Howdoes .NET Remoting work?
  • Why .NET Remoting?
  • Advantages over WebServies
  • Advantages over COM/DCOM
  • How to Create and use .NET Remoting object
  • How to Create and use .NET Remoting Server (Console and windows service application)
  • How to Create and use .NET Remotig Client (Console and Web application)



What is .NET Remoting?

Netremoting replaces DCOM. Web Services that uses remoting can run in anyApplication type i.e. Console Application, Windows Form Applications,Window Services etc. In CLR Object Remoting we can call objectsacross network.


.NET Remoting  Architecture?
  • Methods that will be called from the client are implemented in a remote object class. 
  • Client uses a proxy to call a remote object. 
  • Remote objects runs inside a process that is different from the client process
  • For the client, the proxy looks like the real object with the same public methods. 
  • When the methods of the proxy are called, messages are created. 
  • Messages are serialized using a binary formatter class, and are sent into a client channel. 
  • The client channel communicates with the server part of the channel to transfer the message across the network. 
  • The server channel uses a formatter to deserialize the message, so that the methods can be dispatched to the  remote object.
  • The formatter and the proxy is supplied automatically. 



 How does .NET Remoting work?
.NET remoting involves sending messages along channels. Two of thestandard channels are HTTP and TCP. TCP is intended for LANs only -HTTP can be used for LANs or WANs (internet).

Support is provided for multiple message serializarion formats.Examples are SOAP (XML-based) and binary. By default, the HTTP channeluses SOAP (via the .NET runtime Serialization SOAP Formatter), and theTCP channel uses binary (via the .NET runtime Serialization BinaryFormatter). But either channel can use either serialization format. 

There are a number of styles of remote access: 

SingleCall:

Eachincoming request from a client is serviced by a new object. The objectis thrown away when the request has finished. This (essentiallystateless) model can be made stateful in the ASP.NET environment byusing the ASP.NET state service to store application or session state.

Singleton:

All incoming requests from clients are processed by a single server object. 

Client-activated object:

Thisis the old stateful (D)COM model whereby the client receives areference to the remote object and holds that reference (thus keepingthe remote object alive) until it is finished with it. 


.NET Remoting Specific Advantage?
Lease-Based Lifetime :
Distributed garbage collection of objects is managed by a system called 'leased based lifetime'. Each object has a 
lease time, and when that time expires the object is disconnected from the .NET runtime remoting infrastructure.

Net Remoting takes a Lease-base Lifetime of the object that is scaleable

Call Context :
Additional information can be passed with every method call that is not part of the argument with the help of SOAP 
Header

Distributed Identities :
If we pass a reference to a remote object, we will access the same object using this reference. 



Advantage over Web Services?
1.
It works using purely Commmon Type System.
2.It supports high speed binary over tcp/ip communication.


Advantage over COM/DCOM?
1.It does not have extra interface language (IDL)
2.It Works using purely managed code
3.It's using Common Type System.. No Safearrays etc


Disadvantages
1.It is not an open standard like web services.
2.It is
not as widespread and established ad DCOM.
3.Less support for  transactions,load balancing compared with DCOM
.

Now, Let's have look at remote object, client and server interactions.
Remote Objects 
Aremote object is implemented in a class that derives fromSystem.MarshalByRefObject. A client doesn't call the methods directly; instead a proxy object is used to invoke methods on the remote object.Every public method that we define in the remote object class isavailable to be called from clients. 
To create MyRemoteObject.dll Take .NET IDE New Project->YourName.Samples(for example, MohamedAshraf.Samples(Type Class Library). 

By Default.,Class1.cs will come. Change that file name MyRemoteObject.cs. Copy and paste this file there.

MyRemoteObject.cs
using System;
using System.Runtime.Remoting.Lifetime;
namespace MohamedAshraf.Samples
{
public class MyRemoteObject:System.MarshalByRefObject 

public MyRemoteObject() 

Console.WriteLine("MyRemoteObject Constructor Called"); 

public override object InitializeLifetimeService()
{
return null;
}
public string Hello() 

return "Hello, Welcome to .Net Remoting !"; 


}
Build the assembly MyRemoteObject from the class MyRemoteObject 

Server 
The remote object needs a server process where it will be instantiated. This server has to create a channel and put 
it into listening mode so that clients can connect to this channel. For creating server, Take .NET IDE-> New Project  named "Simple Server".This is console application.
Server Configuration File 
InConfiguration file channel, endpoint, name etc. can be changed withouta recompile. When the client connects to the remote object it needs toknow the URI of the object, i.e. the name of the host where the remoteobject is running, the protocol and port number to connect to, the nameof the server, and the name of the remote object. With the exception ofthe host name we have to specify all these items in the configurationfile. tcp://localhost:9000/SimpleServer/MyRemoteObject 

In SimpleServer.exe.config 
All of the remoting configurations must be added as child elements to <system.runtime.remoting>. 
The <application> element specifies the name of the server withthe name attribute. The application offers a service and requires theconfiguration of channels for the service. 

Wehave the <service> and <channel>elements. The service thatis offered from the application must be listed as a child of<service>. This is the remote object itself. 

The remote object is specified with the <wellknown> element. Forinstantiating the object the framework requires the name of theassembly to know where the type of this object can be loaded from. Wecan set this information with the XML attributetype.type="MohamedAshraf.Samples. MyRemoteObject,MohamedAshraf.Samples" defines that the type of the remote object isMyRemoteObject in the namespace SimpleServer, and it can be found inthe assembly MyRemoteObject. The mode attribute is set to SingleCall. 


We reference the predefined server channel using the TCP protocol: tcp server. We assign the port of this channel 
with the port attribute, as the server must have a well-known port number that the client must be aware of. 

How to create app.config
  • Take Project -> Add New Item -> Xml File -> Enter  file name "app.config" and paster following codes. It will create "ExeName.exe.config" file in debug folder.
app.config file
<?xml version="1.0" encoding="utf-8" ?> 
<configuration>
<system.runtime.remoting>
<application>
<channels>
<channel ref="tcp" port="8000" />
</channels>
<service>
<wellknown mode="Singleton" type="MohamedAshraf.Samples.MyRemoteObject,MohamedAshraf.Samples" 
objectUri="MyRemoteObject" />
</service>
</application>
</system.runtime.remoting>
</configuration>
The Server is implemented in the console application. RemotingConfiguration.Configure() reads the configuration file 
to configure SimpleServer.exe.config to configure and activate the channels. We have to keep the process alive. 
Using Console Application as Server
SimpleServer.cs

using System; 
using System.Runtime.Remoting; 
using MohamedAshraf.Samples; 
namespace SimpleServer
{
class SimpleServer 

public static MyRemoteObject MRB=null;
static void Main(string [] args) 

RemotingConfiguration.Configure("SimpleServer.exe.config"); 
MRB=new MyRemoteObject(); 
RemotingServices.Marshal((MRB),"MyRemoteObject");
Console.WriteLine("Press return to exit"); 
Console.ReadLine(); 

}
Build it.It will create SimpleServer.exe


Using Window Services as Server

span>

For creating server, Take .NET IDE-> New Project  named "RemotingServerWebService". Type windows Service.

SimpleServer.cs

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.ServiceProcess;
using System.Runtime.Remoting;
using MohamedAshraf.Samples; 
namespace RemotingServerWebService
{
public class Service1 : System.ServiceProcess.ServiceBase
{
private System.ComponentModel.Container components = null;
public Service1()
{
InitializeComponent();
}

// The main entry point for the process
static void Main()
{
System.ServiceProcess.ServiceBase[] ServicesToRun;
ServicesToRun = new System.ServiceProcess.ServiceBase[] { new Service1() };
System.ServiceProcess.ServiceBase.Run(ServicesToRun);
}

/// <summary> 
/// Required method for Designer support – do not modify 
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
this.ServiceName = "MohamedAshrafRemotingService";
}

/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null) 
{
components.Dispose();
}
}
base.Dispose( disposing );
}

/// <summary>
/// Set things in motion so your service can do its work.
/// </summary>
protected override void OnStart(string[] args)
{
try
{
string fileName = AppDomain.CurrentDomain.BaseDirectory+"RemotingServerWebService.exe.config"; 
//configure remoting
RemotingConfiguration.Configure(fileName);
MyRemoteObject m=new MyRemoteObject(); 
RemotingServices.Marshal((m),"MyRemoteObject");
}
catch(Exception error)
{
}
}

/// <summary>
/// Stop this service.
/// </summary>
protected override void OnStop()
{
}
}
}

Project Installer
With the installer class, it's possible to build transaction based installations.  With a transaction based installation it's possible to go back to the previous state if the installation fails. It has Install(), Commit(), Rollback() and Uninstall() methods. 
How to create installer class. Right click " RemotingServerWebService" project add new item->Installer Class and copy the following lines.
ProjectInstaller.cs
using System;
using System.Collections;
using System.ComponentModel;
using System.Configuration.Install;
namespace RemotingServerWebService
{
[RunInstaller(true)]
public class ProjectInstaller : System.Configuration.Install.Installer
{
private System.ServiceProcess.ServiceProcessInstaller serviceProcessInstaller1;
private System.ServiceProcess.ServiceInstaller serviceInstaller1;
private System.ComponentModel.Container components = null;
public ProjectInstaller()
{
InitializeComponent();
}

#region Component Designer generated code
/// <summary>
/// Required method for Designer support – do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
this.serviceProcessInstaller1 = new System.ServiceProcess.ServiceProcessInstaller();
this.serviceInstaller1 = new System.ServiceProcess.ServiceInstaller();
// 
// serviceProcessInstaller1
// 
this.serviceProcessInstaller1.Account = 
System.ServiceProcess.ServiceAccount.LocalSystem;
this.serviceProcessInstaller1.Password = null;
this.serviceProcessInstaller1.Username = null;
// 
// serviceInstaller1
// 
this.serviceInstaller1.DisplayName = "MohamedAshrafRemotingService";
this.serviceInstaller1.ServiceName = "MohamedAshrafRemotingService";
this.serviceInstaller1.StartType = System.ServiceProcess.ServiceStartMode.Automatic;
// 
// ProjectInstaller
// 
this.Installers.AddRange(new System.Configuration.Install.Installer[] {

this.serviceProcessInstaller1,

this.serviceInstaller1});
}
#endregion
}
}

Build it.It will create RemotingServerWebService.exe


How to run window Service?

I. Build it. It will create RemotingServerWebService.exe

II. Install the Window Service using InstallUtil.exe

     installutil RemotingServerWebService.exe

Installutil.exeAllows you to install and uninstall server resources by executing theinstaller components of a specified assembly. 
Note:Installutil.execan be found in "%windir%\Microsoft.NET\Framework\v1.0.xxxx" where xxxxis the build number of the  .NET     Framework you installed.

II.Check Our Window services in stalled properly. 

    Take MyComputer -> Manage -> Services and Applications -> Services .

    Here you can see the service name "MohamedAshrafRemotingService". Now the window service is running correctly.. 

II. Uninstall the window service

   installutill /u RemotingServerWebService.exe. Now, Let's have a look at how to to create a client


Client 

For cre

ating client, Take .NET IDE-> New Project  named "SimpleClient".This is console application.

Client Configuration File 
The client configuration file SimpleClient.exe.config uses the XML<client> element to specify the URL of the server usingprotocol://hostname:port/application. We use tcp as the protocol, andthe server runs on localhost with the port number 9000. The applicationname of the server is defined with the name attribute of the<application> element in the server configuration file. The<wellknown> element specifies the remote object we want toaccess. 


The type attribute defines the type of the remote object and theassembly. The url attribute defines the path to the remote object.Appended to the URL of the application is the endpoint nameMyRemoteObject. The channel that is configured with the client canagain be found in the configuration file machine.config

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
<system.runtime.remoting> 
<application name = "SimpleClient"> 
<client> 
<wellknown 
type="MohamedAshraf.Samples.MyRemoteObject,MohamedAshraf.Samples" 
url="tcp://localhost:8000/MyRemoteObject"/> 
</client> 
<channels> 
<channel ref="tcp" port="0"/> 
</channels> 
</application> 
</system.runtime.remoting> 
</configuration> 
Client Application Activate the client channel by calling RemotingConfiguration.Configure(). Using configuration files 
we can simply use new to create the remote object. Next we call the method Hello() of this object. 
Using Console Application as Client
SimpleClient.cs

using System;
using System.Runtime.Remoting; 
using MohamedAshraf.Samples; 
namespace SimpleClient
{
class SimpleClient 

static void Main(string[] args) 

RemotingConfiguration.Configure("SimpleClient.exe.config"); 
MyRemoteObject robj = new MyRemoteObject(); 
Console.WriteLine(robj.Hello()); 
Console.ReadLine(); 


}

Build it you will get SimpleClient.exe


Using Web Application as Client we can embed config file with webconfig file
Using Web Application as Client

For creating web application as client, Take .NET IDE-> New Project  named "RemotingWebClient" Type ASP.NET Web application. Take web.config and replace this file.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

<system.web>

<compilation 
defaultLanguage="c#"
debug="true"
/>

<customErrors 
mode="RemoteOnly" 
/> 

<trace
enabled="false"
requestLimit="10"
pageOutput="false"
traceMode="SortByTime"
localOnly="true"
/>

<sessionState 
mode="InProc"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=127.0.0.1;user id=sa;password="
cookieless="false" 
timeout="20" 
/>

<globalization 
requestEncoding="utf-8" 
responseEncoding="utf-8" 
/>

</system.web>
<system.runtime.remoting>
<application>
<client>
<wellknown 
type="MohamedAshraf.Samples.MyRemoteObject,MohamedAshraf.Samples" 
url="tcp://localhost:8000/MyRemoteObject"/>
</client>
<channels>
<channel ref="tcp" port="0">
<clientProviders>
<formatter ref="binary"/>
</clientProviders>
</channel>
</channels>
</application>
</system.runtime.remoting>
</configuration>

RemotingWebClient.cs
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Runtime.Remoting; 
using MohamedAshraf.Samples; 

namespace RemotingWebClient
{
/// <summary>
/// Summary description for WebForm1.
/// </summary>
public class RemotingWebClient : System.Web.UI.Page
{
private void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack)
{
RemotingConfiguration.Configure(Server.MapPath(".") + "\Web.config"); 
MyRemoteObject robj =new MyRemoteObject(); 
Response.Write(robj.Hello()); 
}

}

#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// Required method for Designer support – do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()

this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
}


Viewing all articles
Browse latest Browse all 10

Trending Articles