Friday, September 5, 2014

Wow ! Background Task in Separate thread in Asp.net web form

Its unfortunate that I never used threading to that extent as most of my work involved in web platform with very little to do with threading and task parallelism. Still there are cases where this Background Task can come handy. Now it depends.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.IO;

using System.Threading;



 
 
public partial class _Default : System.Web.UI.Page



{
 
protected void Page_Load(object sender, EventArgs e)



{
 
//We started this task in separate thread which will not interfere in web page usual activity.

//We can still perform all operations and this below task will run in background.

BackgroundTest longTest = new BackgroundTest(50);

Thread backgroundThread = new Thread(new ThreadStart(longTest.RunLoop));

backgroundThread.Name = "BackgroundThread";

backgroundThread.IsBackground = true;



backgroundThread.Start();
 
Label1.Text = "end";



}
 
///


/// Non Stoppable Button click..I mean we can still perform this operation

/// independent of below background thread.

///

///

///

protected void Button1_Click(object sender, System.EventArgs e)



{
 
Response.Write("Som Button Click");



}
 
///


/// Background Thread

///

class BackgroundTest



{
 
int maxIterations;

public BackgroundTest(int maxIterations)



{
 
this.maxIterations = maxIterations;
}
 
public void RunLoop()



{
 
String threadName = Thread.CurrentThread.Name;

for (int i = 0; i < maxIterations; i++)



{
 
Thread.Sleep(25000);



}
 
System.IO.File.AppendAllText("E:/test", DateTime.Now.ToString());



}

}

}
 

Unity Dependency Injection Resolve

Unity Dependency Injection has given us lot of flexibility in terms of customizations and suits to our requirement. There has been good reference and api for Unity MVC , Web API and WCF service. Here is the good free online e-book to start from scratch. It covers everything from DI, AOP, exception handling, caching and customization.


http://blogs.msdn.com/b/agile/archive/2013/08/20/new-guide-dependency-injection-with-unity.aspx

If you looking for creating instance with Unity DI for any class this is what we must do.

Injection constructor
Injection Methods


Few things to keep in mind.
1. We register interface/Class for object reference.
2. We set resolver for each class object
3. We get the resolver.

Option 1
public class MyObject
{

  public MyObject(SomeClassA objA, SomeClassB objB)
  {
    ...
  }

  [InjectionConstructor]
  public MyObject(DependentClassA depA, DependentClassB depB)
  {
    ...
  }

}
IUnityContainer uContainer = new UnityContainer();
MyObject myInstance = uContainer.Resolve();
Option 2


IUnityContainer container= new UnityContainer();
container.RegisterType<MyObject>(
               new InjectionConstructor(
               new ResolvedParameter<DependentClassA>(), new ResolvedParameter<DependentClassB>()));
               var instance= container.Resolve<MyObject>();
 
We can even have global configuration to resolve all our object instance for any class library.
 

Wednesday, August 13, 2014

Scheduled Load Test

Automating the execution of load tests is actually quite easy. Typically, a load test would be scheduled to run overnight, over a weekend, or even over the course of a few weeks.

The easiest way to accomplish this is to simply have a batch file that executes the load test, and to use the NT Scheduler that comes with all current versions of Windows to schedule when this batch file is executed.


 An example load test start script may look something like this:

  "C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\mstest.
  exe" /TestContainer:ProdLoadTest.loadtest /RunConfig:"C:\Source
  Code\LoadTest\PerfTestRun.testrunconfig"


In this example, the arguments below are passed to MSTest.
TestContainer

Represents the load test that should be executed. This contains all the details, such as Network Mix, run details, and so on, required to execute the test.

RunConfig

Represents the current test configuration which lists the controller to use, deployment options, test naming standards, etc., discussed earlier.
 

VS 2013 Web Load Test Most Common Mistake Using Property StringBody with Content Type Json

Introduction

Every time you deal with data driven web load test in Visual studio remember to follow the correct format for content type. Otherwise one ends up looking into different areas while troubleshooting the issue related to data bind data source . Sequential, Unique and random
 
Load Runner Vs Visual Studio Load test :-
 
It can be my ignorance....please spare me if you see any discrepancies in my thought or understanding process.
 
It reminds how load runner used to work- I used to work with performance test team who shared their screen with me to show the progress of the load run and the failed transactions. There is a threshold limit for number for transactions that is permissible to fail above which test was used to marked as RED or failed. Now coming back to what I understand, this something not about stress test but the test related to number of users that must be loaded to run the test. We used to provide the test data for each scenario and users in excel. Once recording is done during load test this data is picked by each users and constant user load or ramp up of users( step up) applied to generate real time scenario.
 
UNLIKE load runner, webtest in VS records the scenario and runs for all data users at once which is kind of non realistic procedure. What I mean here is, the user data is not bind during load test but it is available as complete run in web test which makes it in complacent or absurd for real time scenario.
 
Its like say login functionality.. I have userid and password for say 10 users in excel. I did recording of webtest with datasource bind to this excel which picks up 10 users at one go. When I apply say load test on this webtest for say 2 users it don't picks up 2 user input data but rather runs one webtest with all 10 users in one set and then subsequent round 2 with set of 10 users input.
 
Visual Studio Load test
[1 webtest -10 user input data]- load test -2 users = 1 Users [1webtest 10 user input data run] +1 users[1webtest 10 user input data run] 
 
Load Runner
[1 webtest]- load test -10 users input data feed = 10 user runs with 10 data inputs =10 run
 
this is perfect and concur to real time scenario
 
Please correct me, if you think this is not the behavior because I spend almost a month understanding this aspect , I research lot but none of the available information talk about this nitty gritties.
 

 

Do remember to apply right format structure, even missing quotes in semantics will lead you to spend lot of time solving the datasource issue..
 
Sometimes webtest runs fine with hardcoded login userid and password but when we bind the data source to bodystring( it is when login is in popup JS) you need to be extra careful with format.
  1. In main content panel of WebTest1.webtest
  2. Right click WebTest1 > Add Web Service Request
    1. Right click http://localhost/ > Properties
    2. Set the url to the web service end point
      1. Set Url: http://localhost:64093/api/user
    3. Expand the url http://localhost:64093/api/user
      1. Right ClickString Body > Properties
      2. Set Content Type : application/json
      3. String Body > Click Ellipsis ...
        {
        "UserId": "{{DataSource1.UserId#csv.UserId}}"
        }
        (NOTE: Using {{DataSource1.UserId#csv.UserId}} will set the value from the CSV.)
  3. Click Save 
 
 
 

Tuesday, August 12, 2014

Parse IIS Log Logparser to filter request to prevent SQL injection.


Problem Scenario

We can reduce traffic by using URL rewrite at the same time making use of Request filtering will ensure unnecessary requests are stopped at IIS web server level itself thus not hitting any database server for further processing. To a greater extent increasingly different combination of useless querystring for given url also a cause of sql server performance degradation.

Parse IIS log using Logparser tool


Using the query below I could see the most frequently used querystring values and it was obvious the site experiencing a SQL Injection attack.

logparser.exe -i:iisw3c “select top 20 count(*),cs-uri-query from ex140702.log
group by cs-uri-query order by count(*) desc” -rtp:-1 >file.txt
 
By viewing the output we can add rules for request that is coming in for webserver in IIS request filtering.
We can keyword for querystring which are identified in the logs by doing this in a way we can restrict unnecessary request and provide access denied to such request. Status code 404.
 
SELECT STRCAT(TO_STRING(sc-status), STRCAT(‘.’, TO_STRING(sc-substatus))) AS Status, COUNT(*)
AS Total FROM w3svc.log to TopStatusCodes.txt GROUP BY Status ORDER BY Total DESC
 
 
Some important areas to be looked for performance stats
 
  1. SQL Profiler
  2. Database Tuning Advisor
For more details
http://www.peterviola.com/solving-sql-server-high-cpu-with-iis-request-filtering/

SQL Server Performance Tips: Top Queries by total CPU Time

SQL Server: Inbuilt Reports

 
 
 

 
 
 
Reference:

My Repository and source of information