web 2.0

On Authentication Timeout - Save Web Form Contents

I was working on a project recently where I had to figure out how to persist user data in a web form after their Forms Authentication session as expired.

So I was thinking of ways to do this as I searched the know all Google. Walla!  Someone's already had to do this, why invent the wheel.  Found a post by Peter Ravnholt, on the MSDN site. http://code.msdn.microsoft.com/formsaver 

He Implements the HttpModule and handles saving the form state on FormAuthentication events. Really neat idea.  I tried is code, now keep in mind I'm doing this for Visual Basic, so I manually converted it all, but I couldn't get it work. Maybe I was converting something wrong.  I was getting "The state information is invalid for this page and might be corrupted."

Well RichardDeeming in the discussions for this post had an updated version that worked a little better then the original. http://code.msdn.microsoft.com/formsaver/Thread/View.aspx?ThreadId=88  Thanks to his code, I converted it to VB.Net and walla!  My pages now handle web content.

I'll post the converted VB version below. 

Thanks Richard and Peter if you ever find your names on here via Google :p

This is my VB version o the FormSaverHttpModule with Richard's changes.  I've modified it a bit since but this works.

Imports Microsoft.VisualBasic
Imports System.Security.Principal
Imports System.IO
Imports System.Web.Configuration
Imports System.Security.Permissions
 
''' <summary>
''' FormSaverModule Version 1.0
''' -Mastro:  Not my orignal idea, found this in use out on MSDN site. I manually converted it to VB
''' as the orignaly is in C#. No comments, so I'll add my own.
''' 
''' This class will handle every new request coming in and PostMapRequest. 
''' If user has Forms Authentication has timed out, class will save the state of the form into cache
''' with a Unique ID of that state to the user's cookie. 
''' 
''' When user logs back in, this class will check if they have the cookie set, if so it will then 
''' load that state back to their page and load the webcontent by generating a runtime transit page that
''' post submits the data back to the destination page and pre-fills in the values.
''' </summary>
''' <remarks></remarks>
<AspNetHostingPermission(SecurityAction.LinkDemand, Level:=System.Web.AspNetHostingPermissionLevel.Minimal)> _
<AspNetHostingPermission(SecurityAction.InheritanceDemand, Level:=AspNetHostingPermissionLevel.Minimal)> _
Public Class FormSaverHTTPModule
    Implements IHttpModule
 
#Region "Private Variables"
 
    Private Const CookieName As String = "#FormStateSaverModule/FormRestoreId"
    Private Shared ReadOnly StateCacheDuration As TimeSpan = TimeSpan.FromMinutes(40)
    Private Shared ReadOnly _AnonymousUser As IPrincipal = New GenericPrincipal(New GenericIdentity(String.Empty), Nothing)
    Private _FormsCookieName As String
    Private _LoginUrl As String
 
#End Region
 
    ''' <summary>
    ''' This class is required from the IHttpModule contract
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub Dispose() Implements System.Web.IHttpModule.Dispose
 
    End Sub
 
    ''' <summary>
    ''' This is the first method to run on application start
    ''' </summary>
    ''' <param name="Context"></param>
    ''' <remarks></remarks>
    Public Sub IHttpModuleInit(ByVal Context As HttpApplication) Implements System.Web.IHttpModule.Init
        Me.Init(Context) 'Lets call our Init and send the Application state along with it
    End Sub
 
    ''' <summary>
    ''' We call this Init Method from the IHttpModuleInit and send it the Application State
    ''' and then turn on Events to capture
    ''' </summary>
    ''' <param name="Context">Hold's the Application State</param>
    ''' <remarks></remarks>
    Protected Overridable Sub Init(ByVal Context As HttpApplication)
        If Context Is Nothing Then
            Throw New ArgumentNullException("context")
        End If
 
        _LoginUrl = FormsAuthentication.LoginUrl 'Store the Login page name
        _FormsCookieName = FormsAuthentication.FormsCookieName 'Store the Forms Authentication Cookie Name
 
        If Not String.IsNullOrEmpty(_LoginUrl) Then 'If LoginUrl Exists....
            Dim index As Integer = _LoginUrl.IndexOf("?"c) 'Search for a ? for query string
            If -1 <> index Then 'If ? was found....
                _LoginUrl = _LoginUrl.Substring(0, index) 'Grab the first part of the URL before the ? and set LoginUrl
            End If
        End If
 
        'Add Handlers that now raise events on every Application BeginRequest... and Application PostMapRequest
        AddHandler Context.BeginRequest, New EventHandler(AddressOf Application_BeginRequest)
        AddHandler Context.PostMapRequestHandler, New EventHandler(AddressOf Application_PostMapRequestHandler)
 
    End Sub
 
    ''' <summary>
    ''' A Delegate receiver method for the Application.BeginRequest Event
    ''' </summary>
    ''' <param name="sender">Object</param>
    ''' <param name="e">EventArgs</param>
    ''' <remarks></remarks>
    Protected Overridable Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
        Dim application As HttpApplication = DirectCast(sender, HttpApplication)
        Dim context As HttpContext = application.Context
 
        Dim cookie As HttpCookie = context.Request.Cookies(CookieName)
        If cookie IsNot Nothing AndAlso Not String.IsNullOrEmpty(cookie.Value) Then 'If Cookie exist and has value....
            Dim state As FormState = FormState.Load(cookie.Value) 'Lets try and load the state via the CookieID
 
            'Lets see if the State is valid now that it's loaded and it's originaly location matches where the user is trying to go
            If state IsNot Nothing AndAlso String.Equals(state.Path, context.Request.Path, StringComparison.OrdinalIgnoreCase) Then
                FormState.SetCurrent(context, state) 'State is valid and it's for this request so lets create the object of the state to be used later by Application_PostMapRequestHandler
                Return
            End If
        End If
 
        If IsPost(context) AndAlso Not IsAccessingLoginPage(context, _LoginUrl) Then 'If user is doing a Post back and it's not to the login page...
            cookie = context.Request.Cookies(_FormsCookieName) 'Load Authenication cookie
            If cookie IsNot Nothing Then
                Try
                    Dim ticket As FormsAuthenticationTicket = FormsAuthentication.Decrypt(cookie.Value)
                    If ticket IsNot Nothing AndAlso ticket.Expired AndAlso Not HasAnonymousAccess(context) Then 'If the user has expired.....
                        Dim state As FormState = FormState.Create(context) 'Store current state into cache
                        If state IsNot Nothing Then
                            cookie = New HttpCookie(CookieName, state.StateId) 'save cache ID into user's cookie
 
                            cookie.HttpOnly = True
                            context.Response.Cookies.Add(cookie)
                        End If
                    End If
                Catch generatedExceptionName As ArgumentException
                End Try
            End If
        End If
    End Sub
 
    Protected Overridable Sub Application_PostMapRequestHandler(ByVal sender As Object, ByVal e As EventArgs)
        Dim application As HttpApplication = DirectCast(sender, HttpApplication)
        Dim context As HttpContext = application.Context
 
        Dim state As FormState = FormState.GetCurrent(context) 'Get the context from the cache if it's there
        If state IsNot Nothing AndAlso state.Form IsNot Nothing AndAlso 0 <> state.Form.Count Then 'if the context was there....
            context.Handler = New FormStateSaverHandler(state) 'Then load the runtime transit page and post it back to destination page
        End If
    End Sub
 
    ''' <summary>
    ''' Returns Boolean if request is a Post request to page.
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Protected Shared Function IsPost(ByVal context As HttpContext) As Boolean
        Return String.Equals("POST", context.Request.HttpMethod, StringComparison.OrdinalIgnoreCase)
    End Function
 
    ''' <summary>
    ''' Return Boolean after it checks to see if content matches the LoginURL. Basically is the user 
    ''' going to the login page.
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Protected Shared Function IsAccessingLoginPage(ByVal context As HttpContext, ByVal loginUrl As String) As Boolean
        Dim result As Boolean = False
        If Not String.IsNullOrEmpty(loginUrl) Then
            If String.Equals(context.Request.Path, loginUrl, StringComparison.OrdinalIgnoreCase) Then
                result = True
            ElseIf -1 <> loginUrl.IndexOf("%"c) Then
                Dim temp As String = HttpUtility.UrlDecode(loginUrl)
                If String.Equals(context.Request.Path, temp, StringComparison.OrdinalIgnoreCase) Then
                    result = True
                Else
                    temp = HttpUtility.UrlDecode(loginUrl, context.Request.ContentEncoding)
                    If String.Equals(context.Request.Path, temp, StringComparison.OrdinalIgnoreCase) Then
                        result = True
                    End If
                End If
            End If
        End If
 
        Return result
    End Function
 
    ''' <summary>
    ''' Returns Boolean if the destination URL in question has anonymouse access.
    ''' </summary>
    ''' <param name="context"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Protected Shared Function HasAnonymousAccess(ByVal context As HttpContext) As Boolean
        Return UrlAuthorizationModule.CheckUrlAccessForPrincipal(context.Request.Path, _AnonymousUser, context.Request.HttpMethod)
    End Function
 
    ''' <summary>
    ''' This class becomes the actual FormState the user was on and is Serialzied and then saved 
    ''' </summary>
    ''' <remarks></remarks>
    <Serializable()> _
    Protected NotInheritable Class FormState
        Private Shared ReadOnly FormRestoreKey As New Object()
 
        Private ReadOnly _id As String
        Private ReadOnly _path As String
        Private ReadOnly _form As NameValueCollection
 
        Private Sub New(ByVal id As String, ByVal path As String, ByVal form As NameValueCollection)
            _id = id
            _path = path
            _form = form
        End Sub
 
        Public ReadOnly Property StateId() As String
            Get
                Return _id
            End Get
        End Property
 
        Public ReadOnly Property Path() As String
            Get
                Return _path
            End Get
        End Property
 
        Public ReadOnly Property Form() As NameValueCollection
            Get
                Return _form
            End Get
        End Property
 
        ''' <summary>
        ''' Loads the state that was set by Setcurrent and tries to return it as a FormState object.
        ''' Returns nothing if it's invalid.
        ''' </summary>
        ''' <param name="context"></param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Shared Function GetCurrent(ByVal context As HttpContext) As FormState
            If context Is Nothing Then
                Return Nothing
            End If
            Return TryCast(context.Items(FormRestoreKey), FormState)
        End Function
 
        ''' <summary>
        ''' Takes the state sent and creates a valid formstate object
        ''' </summary>
        ''' <param name="context"></param>
        ''' <param name="state"></param>
        ''' <remarks></remarks>
        Public Shared Sub SetCurrent(ByVal context As HttpContext, ByVal state As FormState)
            If context IsNot Nothing Then
                context.Items(FormRestoreKey) = state
            End If
        End Sub
 
        ''' <summary>
        ''' Takes the Context of the current Request Form and stores it into Cache with a Unique ID
        ''' </summary>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Shared Function Create(ByVal context As HttpContext) As FormState
            Dim result As FormState = Nothing
            If context IsNot Nothing AndAlso context.Request.Form IsNot Nothing AndAlso 0 <> context.Request.Form.Count Then
                Dim id As String = Guid.NewGuid().ToString()
                result = New FormState(id, context.Request.Path, context.Request.Form)
                HttpRuntime.Cache.Add("FormStateSaver_" + id, result, Nothing, Cache.NoAbsoluteExpiration, StateCacheDuration, CacheItemPriority.Normal, _
                Nothing)
            End If
            Return result
        End Function
 
        ''' <summary>
        ''' Loads the Context stored in Cache using the Unique ID
        ''' </summary>
        ''' <param name="id">Unique GUID</param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Shared Function Load(ByVal id As String) As FormState
            Dim result As FormState = Nothing
            If Not String.IsNullOrEmpty(id) Then
                result = TryCast(HttpRuntime.Cache("FormStateSaver_" + id), FormState)
            End If
 
            Return result
        End Function
 
        ''' <summary>
        ''' Deletes the stored Context from Cache
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub Delete()
            HttpRuntime.Cache.Remove("FormStateSaver_" + _id)
        End Sub
    End Class
 
    ''' <summary>
    ''' This class is responsible for generating the Transit page on the fly. 
    ''' Basically a page that loads all the values then submits them back to the destination
    ''' page with the previous viewstate settings so that the form reloads the controls to where
    ''' they were prior.
    ''' 
    ''' This page quickly shows when the user is logging back in and loading a previous web form.
    ''' 
    ''' </summary>
    ''' <remarks></remarks>
    Protected Class FormStateSaverHandler
        Implements IHttpHandler
 
        Private ReadOnly _state As FormState
 
        Public Sub New(ByVal state As FormState)
            _state = state
        End Sub
 
        Protected ReadOnly Property FormState() As FormState
            Get
                Return _state
            End Get
        End Property
 
        Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
            Get
                Return False
            End Get
        End Property
 
        Public Overridable Sub ProcessRequest(ByVal context As HttpContext) Implements System.Web.IHttpHandler.ProcessRequest
            Try
                Using writer As HtmlTextWriter = CreateHtmlTextWriter(context.Response.Output, context.Request.Browser)
                    Me.Render(writer)
                End Using
            Finally
                _state.Delete()
            End Try
        End Sub
 
        Protected Overridable Sub Render(ByVal writer As HtmlTextWriter)
            writer.RenderBeginTag(HtmlTextWriterTag.Html)
            writer.RenderBeginTag(HtmlTextWriterTag.Head)
            writer.RenderBeginTag(HtmlTextWriterTag.Title)
            writer.Write("Restoring form")
            writer.RenderEndTag()
            ' TITLE 
            writer.RenderEndTag()
            ' HEAD 
            writer.AddAttribute("onload", "document.forms[0].submit();")
            writer.RenderBeginTag(HtmlTextWriterTag.Body)
 
            writer.AddAttribute("method", "post")
            writer.RenderBeginTag(HtmlTextWriterTag.Form)
 
            Dim form As NameValueCollection = Me.FormState.Form
            For Each name As String In form.Keys
                RenderHiddenField(writer, name, form(name))
            Next
 
            'writer.AddAttribute(HtmlTextWriterAttribute.Align, "center")
            'writer.RenderBeginTag(HtmlTextWriterTag.P)
            'writer.Write("You should be redirected in a moment.")
            'writer.WriteFullBeginTag("br")
            'writer.Write("If nothing happens, please click ")
            'RenderSubmitButton(writer, "Submit")
            'writer.RenderEndTag()
            ' P 
            writer.RenderEndTag()
            ' FORM 
            writer.RenderEndTag()
            ' BODY 
            writer.RenderEndTag()
            ' HTML 
        End Sub
 
        Protected Shared Sub RenderHiddenField(ByVal writer As HtmlTextWriter, ByVal name As String, ByVal value As String)
            writer.AddAttribute(HtmlTextWriterAttribute.Type, "hidden")
            writer.AddAttribute(HtmlTextWriterAttribute.Name, name)
            writer.AddAttribute(HtmlTextWriterAttribute.Value, value)
            writer.RenderBeginTag(HtmlTextWriterTag.Input)
            writer.RenderEndTag()
            ' INPUT 
        End Sub
 
        Protected Shared Sub RenderSubmitButton(ByVal writer As HtmlTextWriter, ByVal text As String)
            writer.AddAttribute(HtmlTextWriterAttribute.Type, "submit")
            writer.AddAttribute(HtmlTextWriterAttribute.Value, text)
            writer.RenderBeginTag(HtmlTextWriterTag.Input)
            writer.RenderEndTag()
            ' INPUT 
        End Sub
 
        Protected Shared Function CreateHtmlTextWriter(ByVal writer As TextWriter, ByVal browser As HttpCapabilitiesBase) As HtmlTextWriter
            If browser Is Nothing Then
                Return New HtmlTextWriter(writer)
            End If
            Return browser.CreateHtmlTextWriter(writer)
        End Function
 
 
    End Class
 
 
End Class
 
 
 
 
 

 

Update: 6/10/10

Here is the original post, and it was moved to codeplex here.  Thanks Peter Revnholt!

Team Foundation 2010 – Modify Work Item Types

Create post here on Modifying Work Item Types in TFS 2010 by Ewald Hofman

The parts I was interested in, exporting and importing…

 

When you want to modify the Task work item type in the project collection “DefaultCollection” on the TFS server “MyTfsServer” and the project “Agile project” you can enter the following command:

witadmin exportwitd /collection:”http://MyTfsServer:8080/tfs/DefaultCollection” /p:”Agile project” /n:Task /f:”c:\temp\Task.xml”

You can now make modifications to the work item type… When you are ready, it is time to upload or import the xml file again. To do that you can use the ImportWitd command…:

witadmin importwitd /collection:”http://MyTfsServer:8080/tfs/DefaultCollection” /p:”Agile project” /f:”c:\temp\Task.xml”

Tags: ,

Visual Studio | Team Foundation Server

VS 2010 Low Virtual Memory Fix – Insufficient available memory

 

Man VS 2010 is a memory hog.  Well heck even 2k8 was too, but at least it always let me copy/paste.

After awhile I lose the ability to copy text from my code. With a warning saying “Insufficient available memory to meet the expected demands of an operation at this time, possibly due to virtual address space fragmentation. Please try again later.”

image

Found this post to increase the Virtual Memory: http://msdn.microsoft.com/en-us/library/ff407021(v=VS.100).aspx

However, they have a typo in the command.

If you run their command: bcdedit /set IncreateUserVa 3072 it fails with a “The element data type specified is not recognized, or does not apply to the specified entry.” error.

Run the proper command: bcdedit /set IncreaseUserVa 3072 and you get “The operation completed successfully.

I don’t this will remove the error, just give me more time before it happens.  Supposedly, 64bit doesn't have this problem.

Tags:

Troubleshooting | Visual Studio

Microsoft Desktop Player

 

Microsoft Desktop Player allows developers to access technical content (such as videos, webcasts, podcasts, and white papers) and links to resources (including developer evangelists, local training opportunities, and local user groups) in your area. View it online or download the WPF application to view offline.

http://www.microsoft.com/click/desktopplayer/

Source

 

image

 

This is a pretty neat program.  I downloaded the offline version, and it lets you search for topic areas on development and find related videos.

image

image

image

image

 

image

image

Tags:

Gadgets & Cool Stuff | Web Tools

HTTP Error 404.17

HTTP Error 404.17 - Not Found
The requested content appears to be script and will not be served by the static file handler.

One Possible Solution:

%windir%\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\ServiceModelReg.exe -i

Tags:

Troubleshooting | IIS And Hosting | WCF

How to enable Dreamscene or Video Wallpaper in Windows 7

 

Original Post Here

Dreamscene was a feature introduced in Windows Vista that allowed users to have video wallpapers in the background. Microsoft seems to have replaced the Dreamscene feature from Vista with automatic changing wallpapers in Windows 7.  However by adding the Dreamscene files and making a few registry changes, Dreamscene can once again be enabled. Don’t worry if that sounded intimidating, we do have a file that does all for you [if you're on 32-bit.]

Note: I was unsuccessful in getting this to work on 64-bit Windows 7 Build 7048.

Installing Dreamscene:

1) First, you need to have Aero enabled. You’ll know Aero is enabled if you’re able to preview windows in your taskbar, use Aero Peek, or see the animation effects of windows minimizing. If you think Aero isn’t enabled, open the Start menu, and type in Aero.

How to enable dreamscene in Windows 7

Click on Find and fix problems with transparency and other visual effects and go through the wizard. The wizard will determine whether your computer is capable of having Aero on.

2) If you’re on 32-bit Windows 7, download the Windows 7 Dreamscene patch here

If you’re on 64-bit Windows 7, download this patch and follow the instructions in Important Readme.txt
Then skip Step 3.

3) Run the patch and let it do it’s thing. When it’s finished, explorer.exe will restart.
If it doesn’t restart, press Ctrl + Alt + Delete and click on Task Manager. Right click on explorer.exe and click on End Task. Then click on File, New Task, type in explorer.exe and press OK.

Setting video clips as your desktop background

4) Before you start adding videos, you need to make sure that your videos are in .wmv or .mpg format. If they are not one of those formats, you can download a free video converter here.

Converting a video is simple. Choose Add Video at the top left corner and choose your video of choice. The drop down-menu in the right side-bar will allow you to choose your codec. On my computer, .wmv videos worked properly while .mpg videos would not work with Dreamscene.

The bottom portion of the sidebar will allow you to change the video size or bitrate. If you are not sure what those options do, the only one you should worry about is video sizesince some videos may end up being too large and get cut off the screen.

How to enable Dreamscene or Video Wallpaper in Windows 7

When the video is finished converting, a new window will pop up. Right click your video and choose Open Destination File Location to locate the video. You can also access your converted videos at this directory:
C:\users\%username%\Documents\Any Video Converter\

How to enable Dreamscene or Video Wallpaper in Windows 7

Once you have converted the file, just right-click and select Set as Desktop Background and Dreamscene will begin to work.

Should you want to revert back to a stationery wallpaper, sometimes the stopped video will stay frozen as your wallpaper. To fix this, press Ctrl + Alt + Delete and click on Task Manager. Right click on explorer.exe and click on End Task. Then click on File, New Task, type in explorer.exe and press OK.

Note: Desktop icon text will become transparent sometimes. This is a bug that has yet to be fixed.

Tags: ,

Operating Systems

CHAPTER 1: EVERYTHING I KNOW ABOUT WOMEN

Disclaimer: This is not my opinion, this is just funny, it had to be shared. 

Original:

http://www.geekologie.com/2010/04/thats_real_life_right_there_wh.php

You ever wonder what really happens after you rescue the princess at the end of a video game?

Tags:

Funny

hexadecimal value 0x00 is an invalid character

This is usually an encodnig issues. Invalid characters in the string going into the xml. Remedy this by converting your string data into UTF8 when assining the data to your XML element.

Example:

XRecordDetail = New XElement(Header, System.Text.Encoding.UTF8.GetBytes(OriginalDataString))

Or

XMLData = XMLSystem.Text.Encoding.UTF8.GetBytes(OriginalDataString)

Tags:

VB.NET

HTML5

 

Great site that shows you HTML5 and some of the features in action.

http://apirocks.com/html5/html5.html#slide46

Tags:

HTML5

10 Cool Things You Can Do In Visual Studio 2010

 

 

This one is so useful and helpful that I think it deserved a replicated post.

Found it here and original is here.

1. Pin variables when debugging

At debugging when hovering over variables the “Pin variable” option appears. Clicking on this makes the variable stick next to the source code until removed (and the pin stays there between debugging sessions). It is a really hand utility eliminating having to add variables to the Watch window one by one or search through the Locals window to find the variable one’s looking for. Definitely one of the top 3 new features I use on a day to day basis!

clip_image001

2. Box selection

While holding down the Alt key box selection can be made on the screen. At first glance this feature doesn’t seem to useful. However when typing anything in the selection the same text appears in all lines. So this selection is extremely useful for mass renaming of e.g. visibilities or anything else that involves changing the same thing in all lines.

clip_image002

3. Search on-the-fly

When pressing Crtl and , (comma) the new Navigate To window appears. This is a real-time search window offering basically the same functionality as the Find and Replace window (opened by Crtl + Shift + F) but doing it on-the fly, without having to wait seconds for search results. So the list of results updates the moment you type the next letter in your search expression. Scott said that the search database used by this window is built continously in the background by Visual Studio.

4. Zooming

There’s a small zoom drop down box on the left bottom of the application. It’s barely noticeable but is really useful when showing your code to someone else or doing presentations. Not a function you’ll use too often but comes handy every once in a while!

clip_image003

(Note: zooming can also be used with Crtl + mouse scroll)

5. View Call Hierarchy

Exploring code has been made much easier with the new View Call Hierarchy command in the context menu when right clicking a method. The Call Hierarchy window shows calls from the method, calls to the method and overrides of the method (if any). This little add-on makes exploring someone else’s code so much easier.

clip_image004

6. Sequence Diagrams

The professional and above versions of Visual Studio 2010 come with built-in sequence diagram generation functionality. Simply right click on the method and select Generate Sequence Diagram to get a nifty call sequence diagram.

clip_image005

7. Dependency Graphs

The professional and above versions of Visual Studio 2010 come with a built-in dependency graph generator that generates an interactive, browsable dependency graph. When there is a large number of object this graph can get overwhelmingly large. However the fact that it can track dependencies at assembly, namespace and class level as well make it a useful tool for getting an idea for the project dependencies.

clip_image006

8. IntelliTrace and Dump Debugging

Ever had clients submitting bug reports that you were unable to reproduce and made you wish you could just debug right on their machine? IntelliTrace brings this to reality. When running an application with IntelliTrace enabled it records the series of events happening within it and lets the developer play these back. Note however that IntelliTrace collects less information than one might need at debugging and also has a slight performance overhead when turned on. IntelliTrace is only available in Visual Studio 2010 Ultimate. For more information on Intellitrace see MSDN.

Dump Debugging is the feature that enables to open dump files from production machines and debug those. This is a great feature to use for debugging crashes happening on a production machine. See a video on how to use this feature on Channel 9.

9. Multi-monitor support

Few people knew that Visual Studio 2008 actually had multi-monitor support. You just had to launch an instance on each monitor! Aside from this joke, this feature was one that was really wanted. Now windows can be positioned across monitors making developing and debugging a much better overview on dual screens.

10. Intellisense – lots of small improvements

Intellisense has gone through lots of small improvements. The most important ones are:

  • When selecting any variable all instances of it are highlighted – a well needed improvement that has been around for in lots of text editors
  • Search is not limited to prefixes any more, it is done within strings. So when typing time for example, DateTime will be offered as well (previously only names starting with time were)
  • Intellisense can search just knowing the capital letters of a class. When searching e.g. for HttpCachePolicy it’s enough to type HCP - nice!
  • Javascript intellisense is extensive: all major Javascript libraries are supported (JQuery, Ext.JS, Prototype). Expressions are also evaluated on the fly and Intellisense is offered accordingly.

Tags:

Visual Studio