General Ramblings comments edit

A while ago, I’m not sure when, Amazon released a “Universal Wish List Button” feature that allows you to add a bookmarklet to your browser and when you see something you like, even on another web site, you can click the bookmarklet and have it added to your Amazon wish list.

I find this feature exceptionally handy, particularly around the holiday season when people ask what I want.

Nicole Kidman - Added via the Universal Wish List
Button.

Somehow, I don’t think Santa’s going to be able to help me out with this one. :)

subtext, blog, aspnet, sql, downloads comments edit

A few months back I was working on my blog and did some database maintenance to help slim down the size of things with respect to referral logs based on some logic posted by Phil Haack. Just a couple of days ago, I wanted to see how things were looking in there and noticed the database was starting to get a little big again.

The problem with doing database maintenance, at least for me, is that I don’t have a dedicated SQL instance and I don’t have administrative rights, so I can’t, for example, run a database backup to truncate the transaction logs, and if I mess things up I’m at the mercy of the operator on duty to eventually get to my help desk request and restore me. I also have to have them open up their firewall on a per-IP-address basis so I can connect with SQL Management Studio, and then I’m still sort of stuck because I can only connect from home - the firewall at work blocks that port, so I can’t fix anything on the fly during the day. Normally this isn’t a big issue, and the folks at my host are really good and pretty responsive, but it does limit my abilities.

What this all boils down to is that I need an administrative interface to do this sort of maintenance that’s part of the application. So that’s what I wrote.

Download the zip file, then drop the enclosed ASPX page in your Subtext “Admin” folder. It’s an administration page so you do have to be logged in as an admin to use it. It doesn’t add any navigation links to the admin site, so you do need to manually enter the URL to the page to get to it, but once you do, this page allows you to:

  • Clear the error log. Yes, you can do this from the error log page, too, but it’s nice to have all of this in a central location.
  • See how many referrals you have in your database vs. how many of those are from search engines. The page lists out what qualifies as a search engine or spam referral so you’ll know what this means. It’s basically just a list of expressions that the page tries to match the URL against - nothing fancy.
  • Remove search engine referrals from the referral log. Qualifying spam referrals are also removed.
  • Reindex the referrals table and shrink the database. Do that after you clear out the garbage referrals.
  • See some size statistics on your database.
  • See the SQL script that the page will execute (in the event you’d rather run it yourself or are just curious).

And, of course, since all the code is right in the ASPX markup, you can adjust it as you see fit.

I have only tested this against Subtext 1.9.5b, since that’s the version I’m running on. (I can’t upgrade to Subtext 2.0 yet due to the medium trust problems.) And, of course, standard disclaimers apply: Use at your own risk, YMMV, I’m not responsible for if this truncates every table in your database and kicks your mom, etc.

[Download SubtextDatabaseMaintenance195.zip]

gaming, xbox comments edit

I’ve been considering upgrading my hard drive from my 20GB drive to something larger in the potentially near future because I’m starting to get somewhat low on free space and, while I have a spare 20GB drive, switching drives isn’t teh hawesome.

I was worried about the licensing issues - like whether or not the licenses would transfer from the old drive to the new one, since the DRM on Xbox Live has been the bane of my very existence - but my friend Alex has done the transfer process and it sounds like it came off without a hitch. I asked and he verified that he was able to log in and use content on the console from an account other than the one that purchased the content, which proves that the content was still licensed to the console, not just his account.

Maybe an upgrade will be in order soon.

aspnet comments edit

I realize I’m probably a bit behind the times on this one, but there was just something I wasn’t getting until now.

I know that .NET 3.0 and 3.5 are still on the .NET 2.0 CLR. I get that. Today, though, I was writing a little web form - a one-page, all-code-in-the-ASPX web form to just do a quick test of something. I wasn’t using Visual Studio, I wasn’t creating a whole web project, I just wanted to drop a single ASPX file into C:\Inetpub\wwwroot and run it to see the outcome of a particular expression evaluation. Sort of like Snippet Compiler gone ASPX.

For the life of me, though, I could not get my .NET 3.5 LINQ code to compile. I had the correct <%@ Assembly %> directive to reference System.Core, I had everything looking right… but it wouldn’t use the .NET 3.5 C# compiler, so it wasn’t understanding my LINQ syntax.

The answer: You absolutely must specify the .NET 3.5 compiler in your <system.codedom> section of web.config. No choice. You can’t just drop an ASPX file in there and expect the latest compiler to be used, even if you have it installed. Here’s a snippet:

<system.codedom>
  <compilers>
    <compiler language="c#;cs;csharp" extension=".cs" warningLevel="4" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <providerOption name="CompilerVersion" value="v3.5"/>
      <providerOption name="WarnAsError" value="false"/>
    </compiler>
  </compilers>
</system.codedom>

.NET 3.0 and 3.5 did some great stuff to help you in using the features in ASP.NET. For example, the default web_mediumtrust.config (Medium Trust in ASP.NET) was updated to allow ReflectionPermission so you can use the LinqDataSource control without having to create your own custom trust level.

How come they didn’t update the compiler for ASP.NET to be the latest? Instead, you have to put this in every web.config file of every application you make. (I didn’t notice it because it’s one of the things Visual Studio does for you when you create a new web project.)

Hanselman has a more complete article on the issue, but at a minimum, you need to update the compiler in your web.config.

wcf, dotnet comments edit

Came across an issue today where we want to be able to read WCF service and client configuration from a custom location. That’s actually more difficult than you’d think.

By default, WCF configuration is stored in your app.config (or web.config) file in the <system.serviceModel> section. When you create a client (like with ChannelFactory<T>) or a service host, the application configuration file gets read, the contents get parsed into the appropriate strong types, and “magic happens” - the appropriate object is created.

In our situation, we wanted to do exactly that, but in a Powershell script… and that’s a problem, because the only way we could get WCF to see the configuration was to actually create a Powershell.exe.config file in the Powershell installation directory, run the script, and then remove the configuration. Not so great. We needed the ability to say, “Hey, WCF, use the configuration file that we explicitly specify.”

That, as I said, is a little more difficult than you’d think.

A lot of searching led me to two articles:

I agree, the titles don’t necessarily sound like they’d help much, but they do. They even include source for how to do this so you can see what I’m talking about. That said, I’ll summarize the steps here.

For service hosting, what it boils down to is:

For clients, it’s slightly more work:

  • Create a custom class deriving from ChannelFactory<T>.
  • Override the protected CreateDescription method. In the override, you need to…
    • Call base.CreateDescription().
    • Read in your custom configuration.
    • Create a custom ServiceEndpoint based on your configuration. Don’t forget the bindings, behaviors, etc. (That’s what makes this hard.)
    • Return that custom ServiceEndpoint.

Once you do that, you’re set - you can create a standalone XML configuration file with the <system.serviceModel> section and point WCF at that rather than having to store the configuration in the default app.config/web.config. You are limited to using your custom service host and client classes, but then, if you’re getting into things this deep you’re probably not afraid of getting your hands dirty.

Again, both of those articles contain full source to the solutions so you can see how it works. Check ‘em out.