Cache-Control header cannot be set properly in ASP.NET 2.0 – A solution

Do you know that you cannot set Cache-Control: max-age header in
ASP.NET 2.0? No matter how many combinations you try, you will
always end up with “max-age=0” for sure.

I found solution to the SetMaxAge problem in HttpCachePolicy.
Here’s the code of the function in HttpCachePolicy
(decompiled):

public void SetMaxAge(TimeSpan
delta)
{

if (delta < TimeSpan.Zero)

{

throw new ArgumentOutOfRangeException(“delta”);

}

if (HttpCachePolicy.s_oneYear < delta)

{

delta = HttpCachePolicy.s_oneYear;

}

if (!this._isMaxAgeSet || (delta < this._maxAge))

{

this.Dirtied();

this._maxAge = delta;

this._isMaxAgeSet = true;

}
}

Someone is setting maxAge already to 0. So, if I assign a higher
value it does not get set.

I am not sure why the “(delta < this._maxAge)" condition is necessary. If I somehow set a lower maxAge, I can never increase it!

So, I have made an HttpModule which does this:

void context_EndRequest(object
sender, EventArgs e) {
if (HttpContext.Current.Items.Contains(“SetMaxAge”))
{

FieldInfo maxAge =
HttpContext.Current.Response.Cache.GetType().GetField(“_maxAge”,
BindingFlags.Instance | BindingFlags.NonPublic);

maxAge.SetValue(HttpContext.Current.Response.Cache,
(TimeSpan)HttpContext.Current.Items[“SetMaxAge”]);


// SetMaxAge does not
work.
//HttpContext.Current.Response.Cache.SetMaxAge((TimeSpan)HttpContext.Current.Items[“SetMaxAge”]);

HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.Public);
HttpContext.Current.Response.Cache.SetExpires(DateTime.Now.AddMinutes(5));
HttpContext.Current.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
}
}

If someone sets “SetMaxAge” to a Timespan in the Context.Items,
it will get set to the response and the end of the request. This
ensures, no matter who does what with cache object, maxAge will
definitely be set.

Although this is not a Atlas specific problem, it seems to be a
problem in ASP.NET 2.0 itself.

Now I can cache AJAX call responses on the browser and prevent
roundtrips.

Pageflakes #1 Start page in Web 2.0 awards

Pageflakes won the Web
2.0 Award for #1 Start Page. See the “Start Page” category
from:

http://web2.0awards.org

#2 is Google’s IG and #3 is Microsoft’s Windows Live.

Pageflakes is developed using ASP.NET 2.0 and Microsoft
Atlas.

Here’s what Pageflakes say:

Pageflakes is your personalized Internet. You can add what you
like and remove what you don’t like – and it’s totally simple. What
you see on the site right now is just a selection of a few standard
modules (“flakes”, as we call them) that allow you to read blogs,
do web searches, create a to-do list, check your Gmail account and
read the latest news. Normally you’d have to go to a different web
page for each of those things. With Pageflakes, you have it all on
one page! And it’s all free.

Note: You can now create public sites and share your page with
your friends! Setup a personal site very easily and collaboratively
work together

Stickout – .NET 2.0, Outlook Word Excel Add-in, VSTO, Remoting, you name it

StickOut is a desktop sticky note application with multi-user
support and Outlook integration. It is a .NET Framework 2.0 Windows
Forms application that uses .NET Remoting to communicate with other
StickOut users and exchange sticky notes with them. It uses the new
.NET Framework 2.0 IPC Channel for communicating between Microsoft
Outlook and the StickOut process. The Outlook Add-in allows you to
stick anything out to the desktop from Outlook including e-mails,
notes, tasks, appointments, etc., as sticky notes. Care has been
taken to reduce the memory footprint of a .NET application
significantly and to make a fast and smooth user experience. This
article chronicles my first day of planning the application,
through subsequent design, development, testing, and deployment
days, revealing the evolution of the application, and the
complications I dealt with at each step. You will read about lots
of .NET tricks, deployment and versioning problems, Visual Studio
tricks, and some other non-development–related tricks that
might help you to boost your daily development work.


http://msdn.microsoft.com/netframework/default.aspx?pull=/library/en-us/dnwinforms/html/stickout.asp

Hope you enjoy it!

Top questions asked about data grid

This paper addresses some
of the questions about customizing grid display that are commonly
asked in newsgroups, on Web sites, and in other developer forums.
The techniques described here are sometimes quite simple and at
other times somewhat involved. In each case, however, they address
a question of how to go beyond the basic functionality of the
DataGrid control.


http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vstechart/html/vbtchtopquestionsaboutaspnetdatagridservercontrol.asp

Topics:

  • Windows Forms versus
    Web Forms DataGrid Controls
  • Controlling Column
    Width, Height, and Alignment
  • Customizing Column
    Layout in Display and Edit Mode
  • Formatting Dates,
    Currency, and Other Data
  • Showing and Hiding
    Columns Dynamically
  • Adding Columns
    Dynamically
  • Adding New Records to a
    Data Source Using the DataGrid Control
  • Displaying a Drop-Down
    List in Edit Mode
  • Selecting Multiple
    Items Using a Check Box (Hotmail Model)
  • Editing Multiple Rows
    At Once
  • Selecting Rows by
    Clicking Anywhere

New Model-Driven RAD Tool Generates up to 95% of a Custom Application

Model-Driven Development is a hot topic in the developer
community, but many still don’t know how to make it work in
real-life projects. By offering developers built-in guidance,
tangible architect makes Model-Driven Development finally
accessible to everyone. I have been working on a new custom UML
designer for making the design process a lot easier than using
generic UML designer. It will be released soon. Check out the cool
app:

www.tangible.de

Simulate Windows Service using ASP.NET

How to run scheduled jobs from ASP.NET without requiring a
Windows Service to be installed on the server? Very often we need
to run some maintenance tasks or scheduled tasks like sending
reminder emails to users from our websites. This can only be
achieved using a windows service. ASP.NET being stateless provides
no support to run some code continuously or to run code at
scheduled time. As a result, we have to make our own Windows
Services in order to run scheduled jobs or cron jobs. But in a
shared hosted environment, we do not always have the luxury to
deploy our own windows service to our hosting provider’s web
server. We either have to buy a dedicated server which is very
costly, or sacrifice such features in our web solution. However,
running scheduled task is a very handy feature especially for
sending reminder emails to users, maintenance reports to
administrator, run cleanup operations etc. So, I will show you a
tricky way to run scheduled jobs using pure ASP.NET without
requiring any windows service. This solution runs on any hosting
service providing just ASP.NET hosting:

http://www.codeproject.com/useritems/ASPNETService.asp

If you find this article useful, please vote for me.

.NET 2.0 Process Impersonation feature not working in Windows App

.NET 2.0 introduced an interesting feature in the “Process”
class where you can specify UserName, Password and it runs the
process as the specified user. However, it only works inside
Console Application. It does not run if the application is a
Windows Application. It throws “Win32Exception Access Denied” when
the Start() is called. Is it as designed? I really need this
feature in a windows service.

Try the following code in a console app, it will run perfectly.
But change the application type to “Windows Application” and
run, it will throw exception. IF you do not set the UserName,
Password, it will run then. I am using VS 2005 Release
Candidate.

Here’s the code:

ProcessStartInfo startInfo = new
ProcessStartInfo(@”SampleEXE.exe”);

startInfo.Domain = “.”;

startInfo.UserName = “test”;

// create a secure string from the password we have

SecureString securePassword = new SecureString();

foreach (char c in “test”)

securePassword.AppendChar(c);

securePassword.MakeReadOnly();

startInfo.Password = securePassword;

startInfo.UseShellExecute = false;

startInfo.RedirectStandardOutput = true;

startInfo.RedirectStandardError = true;

startInfo.RedirectStandardInput = false;

startInfo.CreateNoWindow = true;

startInfo.WindowStyle = ProcessWindowStyle.Hidden;

startInfo.WorkingDirectory =

Path.GetDirectoryName(startInfo.FileName);

startInfo.Arguments = “Hi Hello How are you?”;

using (Process p = new Process())

{

p.StartInfo = startInfo;

p.Start();

string fileName = @”output.txt”;

using (StreamWriter writer = new StreamWriter(fileName))

{

writer.Write(p.StandardOutput.ReadToEnd());

writer.Close();

}

p.WaitForExit();

p.Close();

}