2008-12-18

ASP.NET Development Server Responds with 403 - Forbidden in Firefox

I've been working on an ASP.NET site for a few months that requires Windows Authentication, and it was working fine when running the site in the ASP.NET Development Server and accessing in Firefox.

That is, until today.

Today, it decided to start kicking back Forbidden messages every time I tried to access it. Why would it start doing that to me?

It turns out I had at some point told Firefox to remember the password for the site, then had to change my domain credentials after doing so. Since my saved password didn't match the new password, the site was forced to return a Forbidden. I would hope that Firefox would prompt me for a new password when the authentication failed, but it didn't.

So how do we get back to good in Firefox?
You have to go into the Saved Passwords settings in Firefox and remove the site from the list of passwords to store.

In Firefox 3:
Tools | Options
Click on the "Security" button on the ribbon at the top of the Options dialog
Firefox Security Options dialog
Click the "Saved Passwords..." button in the "Passwords" section of the "Security" tab.
Find the offending site in the "Saved Passwords" dialog and click the "Remove" button.
Firefox Saved Passwords dialog
Click "Close" on the "Saved Passwords" dialog.
Click "OK" on the Options dialog.
Open the site again and Firefox should prompt you for the new credentials.

Hope this helps!

2008-11-14

Why We Must Use Classes Instead of Structs for Read/Write DataBinding in C#

Structs are Value Types.
Classes are Reference Types.

When we DataBind in C#, if we're using Value Types... we get copies of those objects instead of pointers to them, for that's how they are passed to the bound control. Therefore, you can't edit the bound control and expect the original objects to be modified. The bound control is only editing the copies and thus we encounter side effects when DataBinding a list or array of value types (like structs.)

I ran into this on a project I was working on where I needed to show a DataGridView for editing attributes. My attribute representation was a struct with a name property and value property... and when I bound a BindingList to the DataGridView, the list would appear... but when I'd edit the values would return to the old values... and when I'd add rows, the values would disappear.

The explanation above explains why. It didn't dawn on me until I started searching for "BindingList structs" and found Bill Wagner's "Of DataBinding and Value Types" (archive.org since the site is no longer available). The title tipped me off because I wasn't thinking about the fact that structs are value types.

Bill's article explains in more eloquent detail than I care to go into here, as I don't feel the need to re-write a well written essay on the topic. I only hope to provide a quick answer for those searching for it, that don't find Bill's article first (and leave myself a quick reference when I forget the next time I try to use a struct...)

He also mentions in his article when it is appropriate to use structs. Thanks for a well-done article, Bill.

So, reminder: use classes instead of structs when you need to do read/write binding. If you're merely databinding for a viewable list... use structs as you like.

2008-10-18

ASP.NET - Getting the Virtual Application Root Path for Your Site

HttpContext.Current.Request.ApplicationPath

I had to blog this here, because I have the need for it every once in a while, but not frequent enough to remember it... :)

Examples:
A site hosted without a virtual directory: mysite.com/
Returns: "/"

A site hosted from a virtual directory: mysite.com/myVirtualDir
Returns: "/myVirtualDir"

See the MSDN Documentation for more details and code examples.
See the "ASP.NET Web Site Paths" article for more ways to discover paths.

2008-10-06

Make Visual Studio Prompt You For Debug Source Code File After Cancelling the First Time

I've run into this problem a few times where I've been given a copy of a dll from another development team that has a PDB file with it... but they forget to send me the source code...

While debugging, I get the prompt for the source code file the PDB has signalled the debugger for (since it doesn't know where to find it initially...) and of course, since I don't have it, I click Cancel.

When you click cancel at this prompt, it adds to a repository in the solution of files NOT to search for. This is annoying, because after that first prompt, you ask the team for the source code so you can go back, expecting the prompt again, and step into the potentially problematic code.

Well, Visual Studio supresses the prompt because of this list within the solution of files not to search for.

"How do I get this back?!" you ask...

Here's the "solution" (get it?!):

The 'Do not search for these source files' dialog

Right-click your solution in Solution Explorer and go to Properties.
Then click on the "Debug Source Files" section under Common Properties.
At the bottom-right of the dialog, there is a "Do not look for these source files:" section. There lies the last-known path to the source-code file (which I assume is provided by the PDB.)
Delete that sucker and Apply/OK out.

Debug again and when you get to the point you want to step into that code again, you will get the prompt and life will be happy again (well, happier, until you fix your bug.)

Happy coding...

2008-09-02

How to Make Visual Studio 2008 Continue After an Unhandled Exception

I was debugging an app that was not handling a particular exception; and I found that after the Exception Assistant dialog appeared and I hit F5 to continue, that it would repeatedly recall the offending line of code which would again throw the exception.

I searched the net and found this forum thread on MSDN that shed some light on how to allow the program to continue after the exception is thrown.

Tools >> Options >> Debugging >> General
(General options show if you only go to Debugging)

Uncheck the "Unwind the call stack on unhandled exceptions" to prevent the debugger from reverting to the offending line as the next statement to call.

2008-08-27

Compatibility Tag for Internet Explorer 8

Microsoft emailed me today to warn me that Internet Explorer (IE) 8 will now be in "Standards Mode" by default instead of the "Compatibility" (sometimes referred to as "Quirks") mode the older versions have run in.

This means that web developers that may have sites out there with invalid markup may run into some issues for people viewing their sites using IE 8.

This is a GOOD thing Microsoft is doing, as it will make their browser play more like the others that are in "Standards" mode by default.

The email Microsoft sent me is to inform developers that they're not left in the dark. Microsoft has offered a way to make the sites tell IE to go back into "Compatibility" mode so it will look the same as it would in IE 7 or earlier.

NOTE: This is not an excuse not to fix your markup!!! You still need to fix your sites to be compliant with standards... this will just buy you some time until you do.

Go to Microsoft's article to find out how to use this compatibility tag should you need to.

Make sure to download Internet Explorer 8 beta and see if your sites may need this tag... your site will render differently in IE7 and IE8 if you do; if they look the same, you're a good developer! :)

2008-08-23

All Your Undelete Are Belong To Us


Click to Enlarge

My friend Clint was trying to do some merging between branches in Microsoft's Team Foundation Server (TFS) the other day, when he came across the error shown in the picture above:

"TF14087: Cannot undelete '[TFS FileName Here]' because not all of the deletion is being undeleted."

Ummmm, ok...?! :)

2008-08-14

JavaScript Won't Run on Internet Explorer as a Local File When Copied From Another Computer

My friend Walt was trying to write a little HTML page with JavaScript to automate a task at work for himself and some colleagues.

He developed it on his own computer; saved it and ran it in Internet Explorer (the only browser allowed to be on their computers at work.) On his computer, the page appeared in "My Computer" (counted in the "Internet" zone if you double-click to bring up the security settings.) Internet Explorer prompted him to allow the ActiveX content.

He then put the file on a network share and allowed his colleagues to download it to their own local machines.

When they downloaded and opened the file in Internet Explorer on their local computers, it appeared as "Restricted Sites" zone. This confused both of us, so I asked him to send me the file.

He transferred it to me via Windows Live Messenger and I saved it to my desktop. I got the same result when I opened it in Internet Explorer.

For an experiment, I edited the file... copied all of its contents into a new file I created from scratch on my machine. When I loaded the new file in Internet Explorer, it appeared as "My Computer" in the "Internet" zone as it had when Walt originally created it.

Thus we can deduce that IE must look at the file's properties and determine if a file was created on the machine asking to run it and if not, locks it down as a "Restricted Sites" file. It treats the ones created on the machine in question as "Internet."

While annoying, this is a nice security feature... and now you know how to get around it...
1. Make sure you analyze the code before you copy to a new file - if you don't and you introduce malicious code on your own machine... shame on you and Microsoft did all they could to protect you. Shame on you... :)
2. Copy the code into a new file that you save to your own machine.
3. Open in Internet Explorer

Of course, I don't know that Firefox has the same restriction, because it doesn't allow direct calls via JavaScript to ActiveX objects so it may run just fine without the extra steps... If so, and you have Firefox on your computer; well, you know what to do.

2008-08-08

Visual Studio Hotfix for Slow Context Menu in Solution Explorer for Solutions with 100+ Projects in Them

Microsoft released a Hotfix for those that have to work with solutions with over 100 projects in them (I feel your pain.)

Their disclaimer warns that it hasn't gone through their full testing process, so you're on your own with it... but we've had good luck with it so far using a solution that has over 150.

Enjoy.

PowerCommands for Visual Studio 2008

For those of you that have to work in Solutions that have tons of projects in them in Visual Studio 2008; you've probably become quickly annoyed by the fact that when you open the solution, all of the projects are expanded.

I got tired of it and searched around the net for something that would help... I found PowerCommands for Visual Studio 2008 by klevy. You can right-click anywhere in the Solution Explorer and select "Collapse Projects" from that level.

It has other really cool features too like:
  • Clear all panes (like Error List, Output, etc.)
  • Copy Path (puts the path of the file in Solution Explorer in your clipboard)
  • Copy and Paste References
  • Edit Project File (to hand-edit the XML)
  • And much more!

I highly recommend it.