Wednesday, October 31, 2007

Changing AppSettings in .NET

Using appsettings("key")=value . Will change the settings in memory and not in web.config

To change it in both, use this method:

VB:

Private Sub ChangeAppSettings(ByVal key As String, ByVal NewValue As String)
Dim cfg As Configuration
cfg = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~")

Dim setting As KeyValueConfigurationElement = _
CType(cfg.AppSettings.Settings(key), KeyValueConfigurationElement)

If Not setting Is Nothing Then
setting.Value = NewValue
cfg.Save()
End If
End Sub

C#:

private void ChangeAppSettings(string key, string NewValue)
{
Configuration cfg;
cfg = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");

KeyValueConfigurationElement setting = (KeyValueConfigurationElement)cfg.AppSettings.Settings(key);

if ((setting != null)) {
setting.Value = NewValue;
cfg.Save();
}
}

Disabling ASP.NET Caching

Most web applications with authentication disable caching so after you logout, you can't click the back button to try and view pages that you shouldn't be accessing.

In ASP.NET, you can use the following code to disable caching
Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1))
Response.Cache.SetCacheability(HttpCacheability.NoCache)
Response.Cache.SetNoStore()

There are some other snippets you could try out too. Here's one:

Response.ClearHeaders();
Response.AppendHeader("Cache-Control", "no-cache"); //HTTP 1.1
Response.AppendHeader("Cache-Control", "private"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "no-store"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "must-revalidate"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "max-stale=0"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "post-check=0"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "pre-check=0"); // HTTP 1.1
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.1
Response.AppendHeader("Keep-Alive", "timeout=3, max=993"); // HTTP 1.1
Response.AppendHeader("Expires", "Mon, 26 Jul 1997 05:00:00 GMT"); // HTTP 1.1

Another one to add directly to the HTML code on your page (this one has been known to not work on Firefox):

meta equiv="CACHE-CONTROL" content="NO-CACHE"

You'll probably want to test the code with all of your target web browsers.

Sunday, October 28, 2007

.NET to Java

The JaCIL compiler can convert .NET assemblies (binaries) to Java byte code. The output is a Java Archive (JAR). You can find more here:
http://www.cs.rit.edu/~atg2335/project/quickstart.php

Saturday, October 27, 2007

Mini-blog comment replies

A lot of people these days write short tit-bits on social networking sites instead of paragraphs and journals of hand-written notes. I think it's an evolution of the Orkut scrapbook and the Facebook wall - you would now post messages to your own scrapbook/wall and people following your mini-blog get notified, often via a free SMS text message.

When you let visitors add comments to your posts, you would reply back to their comment and there's no way for them to know that you've replied to their comment. Blogger.com addresses that by emailing you all comments after yours (or at least that's what I think it does) if you check a little box when posting a comment.

Some systems are smarter and maintain a tree-like structure to keep track of which post is a reply to which other post, but then it all depends on how the designers intended it to be. Being an architect myself, I have to make trade-offs between cost and functionality and, in the end, the more you spend, the better stuff you can come up with.

Friday, October 26, 2007

Java Application as a Windows Service

I was looking up some way to turn a Java application into a Windows service.

In Linux/Unix, it's much simpler since all you need to do is specify a command with all arguments, which in our case is the JVM executable java.exe with the class or Java archive name as a parameter.

In Windows, we would use a product like the Java Service Wrapper or the Java Service Launcher to launch the application whenever Windows starts up, without requiring the user to log in.
I haven't tried either of those products yet since I'm not currently into Java development, but when I do I'll post more about them here.

Monday, October 22, 2007

.NET Remoting over TCP

Remoting in .NET is quite similar to RMI in Java. To begin with, we need an object that has the methods we would be executing on the server-side. This object inherits from MarshalByRefObject. This indicates that the client does not get a copy of the object but rather a reference to the remote object. We then have a hosting process and a client process.

In our example, the hosting process creates a new instance of the TcpChannel class (pass the TCP port number to the constructor of TcpChannel for the server hosting process) and registers the object using ChannelServices.RegisterChannel. Then, the class we are hosting has to be registered using the RemotingConfiguration.RegisterWellKnownServiceType method - it takes the type of our class as the first parameter, the registration name as the second parameter and the object mode (singleton & single call modes) as the third parameter. When creating a console application, we would usually add a Console.ReadLine statement at the end of the application to prevent it from exiting.

The client application would create and register an instance of TcpChannel. Then, obtain an instance of the class hosted on the server using Activator.GetObject - with the type of the class as the first parameter and the URL (Example: tcp://localhost:8080/my_service) as the second parameter. You can now call methods on the object as you would for a normal object.

Sunday, October 21, 2007

Type Forwarding

Type Forwarding enables client applications to refer to a library at compile time for a type that is later moved to another library.

Example:
using System.Runtime.CompilerServices;
[assembly:TypeForwardedTo(typeof(DestinationLib.TheType))]