Saturday, March 05, 2011
To Throw or to Rethrow :)
Sunday, December 19, 2010
Convert Vs Parse Vs TryParse
Saturday, November 15, 2008
WS Response: XML Compression
Compressing the XMLs sent over the wire helps reduce the network traffic significantly. Compressing responses on the server and decompressing them on the client consumes additional CPU cycles on both server and client, but the savings in bandwidth is likely to justify the processing cost. XML compression can be implemented by using one of the following techniques: EnableDecompression property gets or sets a Boolean that indicates whether decompression is enabled for this HttpWebClientProtocol. Default value for the property is “False”. The property is supported in .Net framework 2.0 and above. E.g. WebServiceRef.Service service = new WebServiceRef.Service(); service.EnableDecompression = true; When the server returns the results, they are in gzip format, deflated format, or uncompressed. The property is only a suggestion, not a demand. To enable compression in .Net 1.1 GetWebRequest, GetWebResponse methods needs to be overridden in the proxy class generated. As the modified code will be removed if web reference needs to be added again, instead of modifying proxy code a class is inherited from proxy class and the methods are overridden in that class. This method is also useful when the message created by proxy needs modification before sending it. E.g. protected override WebRequest GetWebRequest(Uri uri) // Update the request's HTTP headers to specify that // we can accept compressed (gzipped, deflated) responses { WebRequest request = base.GetWebRequest(uri); if (compressResponse) { request.Headers.Add("Accept-Encoding", "gzip, deflate"); } return request; } protected override WebResponse GetWebResponse(WebRequest request) // If we've requested compressed responses, return a WebResponse // derivative that's capable of uncompressing it. { WebResponse result; // If user checked the Compressed Response checkbox if (compressResponse) { result = new CompressedWebResponse((HttpWebRequest) request); } else // no compression requested, return stock WebResponse object { result = base.GetWebResponse(request); } // Keep track of content length to measure bandwidth savings. responseContentLength = result.ContentLength; return result; } The CompressedWebResponse class uses the #ziplib library (available athttp://www.icsharpcode.net/OpenSource/SharpZipLib/) to decompress responses. To enable IIS 5.0 to compress .aspx pages, follow these steps: Open a command prompt. 1. Type net stop iisadmin, and then press ENTER. 2. Type cd C:\InetPub\adminscripts, and then press ENTER. 3. Type the following, and then press ENTER: 4. CSCRIPT.EXE ADSUTIL.VBS SET W3Svc/Filters/Compression/GZIP/HcScriptFileExtensions "asp" "dll" "exe" "aspx" Type the following, and then press ENTER: 5. CSCRIPT.EXE ADSUTIL.VBS SET W3Svc/Filters/Compression/DEFLATE/HcScriptFileExtensions "asp" "dll" "exe" "aspx"1. Set EnableDecompression property
2. By extending proxy class in client for the compression and decompression of requests and responses
Note that you need a decompression mechanism on the client and client should request the server for zipped response (This could be done by point 1 and 2 above).
Performance of the application can be increased by executing multiple web methods at the same time if they are not dependent on each other.
For example,
Consider two web service methods as follows:
[WebMethod]
public float CalculateIncomeTax(float basic)
{
//Complicated calculations which takes time
Thread.Sleep(8000);
return basic/100;
}
[WebMethod]
public float CalculateServiceTax(float basic)
{
//Complicated calculations which takes time
Thread.Sleep(5000);
return basic/1000;
}
The following code calls these methods.
Synchronous call:
private void buttonSynch_Click(object sender, EventArgs e)
{
//Calculates Income tax
StartProcess(true);
newWebService.CalculateIncomeTax(100000);
StartProcess(false);
//Calculates Service tax
StartProcess(true);
newWebService.CalculateServiceTax(100000);
StartProcess(false);
}
Time required for execution = Time required for ( CalculateIncomeTax) + Time required for (CalculateServiceTax)
= Approx 8 Sec. + Approx 5 Sec.
= 13.963955 ( Actual time required)
= Approx 14 Sec.
Asynchronous call for one function:
private void buttonAsynch_Click(object sender, EventArgs e)
{
StartProcess(true);
newWebService.CalculateIncomeTaxAsync(100000);
StartProcess(true);
newWebService.CalculateServiceTax(100000);
StartProcess(false);
}
Time required for execution = Max (Time required for ( CalculateIncomeTax), Time required for (CalculateServiceTax) )
= Max ( Approx 8 Sec. , Approx 5 Sec. )
= 8.429886 (Actual time required )
= Approx 8 Sec.
int countProcess = 0
void StartProcess( bool startProcess )
{
if (startProcess)
m_countProcess++;
else
m_countProcess--;
if( m_countProcess == 0 )
labelProcessingTax.Text = "";
else
labelProcessingTax.Text = "Processing";
labelProcessingTax.Refresh();
}
Event handler is written to handle Asynchronous call completion event for CalculateIncomeTax method.
newWebService.CalculateIncomeTaxCompleted += new WindowsApplication1.NewService.CalculateIncomeTaxCompletedEventHandler(newWebService_CalculateIncomeTaxCompleted);
{
if (e.Cancelled == true)
return;
}
Proxy class contains two overloaded methods for each web method to facilitate asynchronous calls.
I. Single-invocation:
(Web method name)Async ( method parameters…)
II. Multiple-invocation:
(Web method name)Async ( method parameters…, , object userState)
Userstate should be unique value (for example, a GUID or hash code).
Usage:
1. Multiple asynchronous calls:
Multiple-invocation makes possible calling methods asynchronously multiple times without waiting for any pending asynchronous operations to finish.
Trying to call methods asynchronously with single-invocation syntax multiple times, before previous invocation is completed throws InvalidOperationException.
2. Tracking Pending Operations:
userState objects passed as parameters can be stored in collection to keep track of all pending tasks.
3. Canceling Pending Operations:
Any particular instance of asynchronous operation can be cancelled by specifying the userState parameter passed during invocation to CancelAsync function.
E.g. newWebService.CancelAsync(userState);
Asynchronous calls invoked by single-invocation syntax are not cancellable.