Contents
Introduction
C# Webcam is a port to ASP.NET and C# of the
C++ ATL Web Service. It demonstrates the ease of use of C# and ASP.NET
to build Web Services compared to ATL Server Web Service.
The project is still based on the Webcam COM component developed in the
C++ ATL Web Service. .NET COM Interop is used to import it in the C#
project.
Web Service
With Visual Studio, create a new C# ASP.NET Web Service project. Add a
reference to 'CamServer 1.0 Type Library' on the COM tab. If 'CamServer 1.0
Type Library' is not in the list, you need to register the Dll CamServer.dll in
the 'COM Components' directory. Add this Web Method to the source code obtained
by the wizard:
[WebMethod]
public byte[] GrabFrame( short nQuality )
{
CAMSERVERLib.Camera cam = new CAMSERVERLib.CameraClass();
return (byte[])cam.GrabFrame( nQuality );
}
Compared to the
C++ ATL
Web Service we need only three lines of code to get the picture from
the COM component and return it to the client.
To have a little more fun coding I decided to add some features. Now it writes
to the Windows EventLog the IP and the name of the machine calling it, after a
DNS resolution. I have also added the date and hour of the local computer
directly in the picture. And at last it increments a system performance counter
to keep an eye on the number of people calling it.
[WebMethod]
public byte[] GrabFrame( short nQuality )
{
string addr = HttpContext.Current.Request.UserHostAddress.Trim();
string name;
IPHostEntry host = null;
try
{
host = System.Net.Dns.GetHostByAddress( addr );
if ( host != null )
{
name = host.HostName;
for( int i = 0; i < host.Aliases.Length; i++ )
name += "*" + host.Aliases[i];
eventLog.WriteEntry( addr + " : " + name );
}
else
{
name = "ERROR";
eventLog.WriteEntry( name );
}
}
catch( System.Exception error )
{
}
CAMSERVERLib.Camera cam = new CAMSERVERLib.CameraClass();
byte[] picture = (byte[])cam.GrabFrame( nQuality );
performanceCounterShoot.Increment();
MemoryStream ms = new MemoryStream( picture );
Bitmap bmp = new Bitmap( ms );
Graphics g = Graphics.FromImage( bmp );
string strDate = DateTime.Now.ToLongDateString() +
" - " +
DateTime.Now.ToLongTimeString();
g.DrawString( strDate,
new Font( FontFamily.GenericSansSerif, 10 ),
new SolidBrush( Color.Black ),
new RectangleF( 1,1,320,240 )
);
g.DrawString( strDate,
new Font( FontFamily.GenericSansSerif, 10 ),
new SolidBrush( Color.White ),
new RectangleF( 0,0,320,240 )
);
MemoryStream ms2 = new MemoryStream();
ImageCodecInfo[] icf = ImageCodecInfo.GetImageEncoders();
EncoderParameters encps = new EncoderParameters( 1 );
EncoderParameter encp = new EncoderParameter( Encoder.Quality, (long) nQuality );
encps.Param[0] = encp;
bmp.Save( ms2, icf[1], encps );
ms2.Close();
return ms2.ToArray();
}
Client
The client ActiveX has no need to be modified. It is just needed to change the
url of the Web Service, that is now:
http://YOUR_IP/webcamcsharp/service1.asmx?WSDL
Don't forget to register with regsvr32.exe the AxCamClient.dll in the 'COM
Components' directory.
Conclusion
With few lines of source code you may obtain the same result then with little
more C++ work.
The solution may be better because the COM component pack the picture, we
unpack it to add date and hour then we pack again the new picture to send back
to the client.
Problems Faced
History
Version 1.00
|
April 10, 2002
First release.
|