February 10, 2014

ASP.NET Session and concurrent access

Problem

In one of my projects I found some a strange at first sight issue related to concurrent Session usages. During one long request the other parallel requests were waiting until the previous one is finished.
This issue occurs when user tries to download file from ashx-handler. Handler requires Session to get some user-related configuration which is stored there.

Overview

I've tried to dig deeper and that what I've found.
By default no concurrent access to the asp.net session state is allowed. Requests with same SessionID will be locked exclusively to prevent potential corruption of its state.

What does it mean:

When you have request1 `in progress` and trying to do request2 - Session object will be locked by request1 and our code in request2 will be waiting for request1 completed.

ASP.NET Session is thread safe and synchronization mechanism is based on System.Threading.ReaderWriterLock.

January 4, 2013

Can developer do a Sushi? Yes :)

Hello everybody, today I want to show you that developers can do more than only develop software.
I'm going to show you step-by-step solution about how to do a sushi and what do we need for that.

I'm junior sushi-developer and some of these cooking-steps are not perfect (as in original Japan cooking..).

In this article I'm going to describe how to do some custom-sushi roll from that stuff which I found in my fridge. If you want to do such rolls like California, Philadelphia and other - the whole receipt will be the same but only with different ingredients.

Content:

  1. Ingredients overview.
  2. Cooking rice.
  3. Cooking Tomago (Japanese sweet egg omelet).
  4. Prepare sushi filling.
  5. Make a sushi roll.
  6. Cut a roll.
  7. Results.

*Be careful, a lot of photos...

December 15, 2012

.NET: Create EventSource in Windows Event Log (with Admin privileges on Windows7)

Problem
We had one project which logs exception and some system information to Windows Event log. We had to write all logs in appropriate EventSource (created only for our application in Application log). As you may know creating EventSource requires Administrative Privileges on Windows Vista and higher. For deployment we use ClickOnce which does not have such a functionality (i.e. to create event source).

In this article I want to describe solutions that we found, I think maybe most of them (but not all) are obviously for you, but I hope this article will be useful .

Resolving
This is what msdn says about EventSource creation (a full article):
To create an event source in Windows Vista and later or Windows Server 2003, you must have administrative privileges.
The reason for this requirement is that all event logs, including security, must be searched to determine whether the event source is unique. Starting with Windows Vista, users do not have permission to access the security log; therefore, a SecurityException is thrown.
In Windows Vista and later, User Account Control (UAC) determines the privileges of a user. If you are a member of the Built-in Administrators group, you are assigned two run-time access tokens: a standard user access token and an administrator access token. By default, you are in the standard user role. To execute the code that accesses the security log, you must first elevate your privileges from standard user to administrator. You can do this when you start an application by right-clicking the application icon and indicating that you want to run as an administrator.

We don't want to force users to run our application manually by administrator. And we don't want always to run our application with administrative privileges (automatically) to be sure that we can create EventSource whenever we need it.

You may ask: why always to run with admin privileges?
Because it is a standard Windows Vista security mechanism. On application startup Windows will analyze manifest and show 'run as administrator' UAC dialog to a user.
For more information about manifest file, run application with administrator privileges and others - you can read here.

I started to investigate this problem and found few solutions:

November 23, 2012

Encrypting and Decrypting Web.config Sections in .NET 4.0

Problem
Sometimes we need to store a lot of confidential data in web.config in our production environment (for examples: username\password for impersonation or for connect to database, some appSettings, etc.). And it is not secure to store that as clear text, obviously some people on your server may have access to this file and steal your data.
.NET Framework gives us a good solution. We can encrypt configuration sections in web.config files.

How to Encrypt a section
1. Find aspnet_regiis.exe on your PC.
2. Grand access to ApplicationPool Identity for NetFrameworkConfigurationKey RSA key contanier:
aspnet_regiis -pa "NetFrameworkConfigurationKey" "<ApplicationPool Identity user>"
3. Encrypt a section:
aspnet_regiis -pe "<Path/to/section>" -app "/<YouWebApplication>"
*All these commands require administrative privileges, so if you want to use command prompt for it - don't forget to 'run as administrator'. Otherwise you will get a lot of very strange errors.

It looks very simple...
But let's consider all these steps in more detail.

November 1, 2012

Settings in .NET are easy

As I said 'few' days ago, today I`ll tell you about Settings files.
Settings files are designed to make our life simpler during working with application and user configuration.

A bit theory

Settings file consists of few parts in our project.
  1. Settings file (auto generated class derived from ApplicationSettingsBase).
  2. app.config (contains default values for all options).
Generated setting file derived from ApplcationSettingsBase already contains initialized static instances of all our options. We don't need to create this class manually and load any data, because it has already been created and loaded. And it is ready to work.

All settings have next properties:
  • Name (this is the name of our setting): with this name we will have automatically generated property in Settings class.
  • Type (the type of our setting): there are a lot of predefined types like string, int, etc., but you can also set your custom type.
  • Value (this is default value for setting).
  • Scope: all settings should be in one of two scopes (User or Application). It represents how our setting will be accessed at runtime.

October 22, 2012

XML Serialization

Problem

A long time ago I had to implement some data storage between restartings of application in one of my projects. I started looking for the best solution to do that and one of them using .NET Settings files (about that I`ll write in the future), another – to use serialization (I`ve chosen xml serialization because it is more human readable and flexible).
Serialization is the process of converting an object into a stream of bytes in order to store or transmit it.
Deserialization is the opposite process to serialization – converting data to object.

The most used serialization types in .NET Framework:
  • Binary serialization (is the serialization process with binary data as a result)
  • Xml serialization (is the serialization process with XML data as a result)
XML serialization approach is “cross platform”. We can serialize data in one application (for example java-based) and deserialize it in .NET app.

Want to know more about XML Serialization? Welcome...