Another nifty debugging story today.
The goal was to unify my Sitecore keepalive URL across all environments. You see when you have not one but three production servers, managing your web.config becomes a real bitch of a problem, and the Sitecore UrlAgent is one of the most annoying.
For the purposes of this post, let’s call our site
http://www.bobble.com. Why? Well the Bob part is obvious, and there’s no denying that Bubble Bobble wasn’t one of the greatest games ever. But I digress…
So, the solution is pretty simple. I create a local hosts entry and binding in IIS. I ensure the IIS binding uses the local IP so this will only work on the server.
I do this on all environments from dev through to production. I can now set my keepalive URL to:
Simple. Done. I fire-up IE (because this is Windows 2008 production and we don’t have luxuries like Firefox and Chrome installed) and hit the URL to make sure it’s working… FAIL.
WTF?! Why would this happen.. this is simple. 1) Update hosts file. 2) Update IIS binding on website. 3) THERE IS NO 3.. it’s that simple! I’m perplexed, completely perplexed. I check, I double check, I double check the double check. My checks become sextuplets. I’ve got a whole family of checks for my complex DNS configuration. I refresh the browser at least 20 times. So you get it, I’m banging my head against the wall. All I keep getting is the STUPID IE FAIL SCREEN!
I ping the host name. All good – IP is correct. I try it with the real IP instead of the loopback IP. No change. There must be someway to get some real info on the problem.
telnet to the rescue
It hits me.. I wonder if I can telnet to the site and get some kind of response? A quick Google, and… Yes!
Here is the eventual command line process. Open Command Prompt and enter the following:
so we can see what we are doing. If we couldn’t before we can now see the prompt
Microsoft Telnet>set crlf
something to do with the enter key behaving how we want it to.
Microsoft Telnet>o bobble.localhost 80
connects to the site. The cursor will probably jump back to the top of the command window but the output won’t be cleared. You’ll need to just type over the existing output.
GET /sitecore/service/keepalive.aspx HTTP/1.1
Hit enter twice to send the request… we should now get the full HTTP output of the request.
UHUH!! Here’s our answer..
HTTP/1.1 301 Moved Permanently
Content-Type: text?html; charset=UTF-8
Date: Thu, 26 Jul 2012 01:13:06 GMT
<body><h1>Object Moved</h1>This document may be found <a HREF="http://www.bobble.localhost/sitecore/service/keepalive.aspx">here</a></body>
I remember now. There is an IIS rewrite set up in the web.config that redirects all non-www domains back to the www.* domains. And because I don’t have http://www.bobble.localhost set up (in IIS nor DNS) the browser can’t even get close to finding it!
With telnet I was able to get the exact request details, without any silly attempts by the browser to redirect. This is going to be mighty useful in the future.