Welcome to MSDN Blogs Sign in | Join | Help

The team had been at the Microsoft technical readiness conference last week. The conferences are great opportunities to talk with our technical field and talk through what's happening, and converse between corporate and the field. I, personally, always enjoy these events when I have the opportunity to attend these - to listen and to learn from the speakers, to meet new folks from the field and learn about issues on the ground, and to meet with Microsoft folks I hadn't seen in a while.

This time around, I saw a gaggle of things that woke the inner-geek up. These are a few of my favorite things:

  • I got to see Ron and Rob's REST sample application, walking through how to make WCF more and more RESTful. They will be doing a series of screencasts on this; if you haven't checked out their first screencast in the series (Ron mentioned this in his post last week), I would recommend it.
  • Watching Matt Winkler present will always make one's week.
  • A couple Microsoft folks (and Christian Weyer) walked through using WF and WCF within "BizTalk Services." This was the first time I had seen the services in action, and - in fact - I signed up on Wednesday to play with it further.
    One of the more interesting items with "BizTalk Services" is the fact that they added the capability to use XOML-only workflows a couple weeks ago. While their activity pool is a bit limited at the moment, I really like the promise in the system.
  • I love watching people write code on stage. I picked up a couple new tricks that I was unaware VS2008 could do and some additional dev tools that can be used to aid in WCF service development, but will become part of my toolbelt.
  • Matt Winkler and Kirk Evans each did a 400-level session covering patterns in WF; these may evolve into articles in the future.

This week, I'm in Chicago in training. We're working through publishing a few documents, but otherwise it's a lighter week on the product management front.

I recently installed a couple Outlook file preview handlers that have made my life much better:

And, while you may at Foxit's website installing their excellent viewer, it may be worth noting that they also offer a PDF iFilter that works quite well with Windows Desktop Search on XP and on Vista. This iFilter has been a huge hit at home, allowing us to depend on the text in the PDF file, rather than our folder naming practices, when looking for instruction manuals for the reverse osmosis filter (not that this is an actual example from last weekend or anything :) ).

I wanted to post a quick notice that I updated two downloads over the past few weeks.

Both WF Web Workflow Approvals Starter Kit and Simple Human Workflow Quickstart Sample Code had a couple small bugs in them (low priority issues, mostly dealing with Visual Studio packaging of the files) - I've fixed them, repackaged them, and posted them back up for download. Please let me know if you find anything that I may have missed.

I'm excited to announce that I've changed roles within Microsoft. For the past month, I've been a part of the .NET product marketing team as the senior product manager for Windows Workflow Foundation (WF).

What does that mean for this space? For this blog, it doesn't really mean anything, to be honest. I will be blogging a lot more, but not here - I will be blogging to the team blog (which I will link once we've agreed on a blog name), I will be working with Ron Jacobs on some Channel9 shows, and posting in the forums more. So this will be more of a 'hey - check this out' roll, rather than a place for original WF content. There will still be occasional meaningful content, but it will probably be related to my weekend/side activities.

I'm very excited about the role - it allows me to actually talk about my work externally, since most of the content is not covered under NDA for .NET v3.x stuff, and the newer stuff as we move through the calendar year.

I was trying to add some more style into the WoW Guild Roster module I'm writing, but I ran into an issue that stumped me for quite a while - how to link to the CSS file.

The issue with linking to a Cascading Style Sheet (CSS) was problematic on two fronts:

  1. DotNetNuke development is done via ASCX files, and not ASPX files
    This means that I'm coding for the control, and not the page. As such, I never quite know where the location context of the rendering is occurring.
  2. DotNetNuke uses some rather unfriendly URLs
    The web browser sees something more like this:
    http://www.mywebsite.com/WebSiteInformation/DNNWebPage/tabid/167/Default.aspx
    This poses all kinds of obvious problems, taking my first point and multiplying it a few more times over.

Needless to say, I was convinced that using the standard <link> call wasn't looking too useful at this point. After looking around and playing with the code for 20-30 minutes, there's a couple routes to go for this:

  • Use a hard-coded URL such as:
    <link rel='stylesheet' type='text/css' href='/DesktopModules/MyModuleName/customModuleStyles.css' />
  • Create a custom function in your code-behind to handle the URL (as discussed by Milan in his on Stylesheets and Master pages blog post a couple years ago)
  • Use the ResolveUrl() method so that it looks like:
    <link rel='stylesheet' type='text/css' href='<%= ResolveUrl("~/DesktopModules/MyModuleName/customModuleStyles.css") %>' />

I ended up using with the third option, quite happily, and thought I would share here.

A couple large events have finished up for the week - the internal TechReady conference here in Seattle and the Office Developer Conference down in San Jose.

Coming out of ODC, a lot of material is hitting the public wire, with more starting to prime up at stage left for MIX-2008 and the SharePoint conference (for which I'm currently wait-listed for), both in a few weeks. It's an overall exciting time to be at Microsoft, to be a partner of Microsoft, and to be a customer. I just wish our stock was being treated better...but I digress... :-)

On a personal note, there was a lot to get excited about:

  • A new book on building Office Business Applications got highlighted, written by a colleague of mine, Bhushan Nene, along with a few other folks I see on the DLs
  • I learned a lot about C# 3.0 - I took a 'drive around the new features' hands-on-lab that walked through the new syntax and features. I had already learned about a couple of them in watching some VS2008 demos, but it's a whole lot of goodness. And one of the best things is that many of the C# 3.0 features can still be used in VS2008 when you are targeting the .NET Framework v2 runtime.
  • It's amazing how many of my DPE colleagues are blogging, podcasting, and creating just spectacular demos! I was quite inspired, I must admit. And while there isn't much I can publicly blog about in my current role (too many of my conversations are NDA conversations with ISV partners, and really wouldn't be of interest to the general public who aren't AIIM members anyway), it's inspired me to do a lot more internally.
    Along a similar note, I've gone and grabbed a copy of DemoMate and Camtesia - and it will probably yield more interactive content here around my DNN/WoW work, if nothing else.
  • I attended some sessions on WPF, and I feel the need for some WoW/raid analysis tools using WPF and Silverlight at some point in the summer. This should be fun!

All of that being said, I have one more day of TR6 stuff tomorrow, then I get to start catching up on sleep and try to pick up my regular schedule again.

I drove into Seattle this weekend for the TechReady 6 pre-conference events for DPE. Lots of really good content, and always good to hear what other evangelists are up to. This will be a long week of commutes into Seattle - the drives in were nice this weekend, but I'm not looking forward to the traffic tomorrow (I'm taking Metro).

After a day full of sessions by DPE folks such as Robert Hess and Jeff Sandquist, and a few platform notables such as Scott Guthrie, the partner booths opened up for TR6 (partners were on-site for tonight only) and I caught up with my ISV partners. It was great to see those who made it - they split their booth staffing between the ODC and TR6.

One of my side projects is working on a WoW Guild Roster. I've been doing a lot of work over the past couple months with Visual Studio 2008, although I've been stuck with ASP.NET v2 since DNN won't be supporting v3.5 until DNN v5. One of the features that has me really excited within .NET v3.5 is LINQ.

So, while I was playing with LINQ, I decided 'what would the code look like if I were to query WoW character data from the WoW Armory? So...I sat down and wrote a quick query of character information.

XDocument _charSheet;

System.Net.WebClient _wc = new System.Net.WebClient();
_wc.QueryString.Add("r", this.Realm);
_wc.QueryString.Add("n", this.CharName);
_wc.Headers.Add("user-agent", "MSIE 7.0");
System.Xml.XmlTextReader _reader = new System.Xml.XmlTextReader(_wc.OpenRead(ArmoryCharSheet));

_charSheet = XDocument.Load(_reader);
IEnumerable<XElement> _charInfoEl = _charSheet.Root.Descendants("characterInfo");
if (_charInfoEl.Count() < 1) {
  MessageBox.Show("No descendants at <characterInfo>");
} else if (_charInfoEl.Count() > 1) {
  MessageBox.Show("Multiple descendants at <characterInfo>");
}

var _charInfo = from item in _charInfoEl.Descendants("character")
                select new {
                  Battlegroup = item.Attribute("battleGroup").Value,
                  CharURL = item.Attribute("charUrl").Value,
                  Class = item.Attribute("class").Value,
                  ClassID = item.Attribute("classId").Value,
                  Faction = item.Attribute("faction").Value,
                  FactionID = item.Attribute("factionId").Value,
                  Gender = item.Attribute("gender").Value,
                  GenderID = item.Attribute("genderId").Value,
                  GuildName = item.Attribute("guildName").Value,
                  GuildURL = item.Attribute("guildUrl").Value,
                  LastModifiedString = item.Attribute("lastModified").Value,
                  Level = item.Attribute("level").Value,
                  Name = item.Attribute("name").Value,
                  Prefix = item.Attribute("prefix").Value,
                  Race = item.Attribute("race").Value,
                  RaceID = item.Attribute("raceId").Value,
                  Realm = item.Attribute("realm").Value,
                  Suffix = item.Attribute("suffix").Value
                };
IEnumerable<XElement> _profsEl = _charInfoEl.Descendants("professions");
var _profs = from item in _profsEl.Descendants("skill")
                select new {
                  Key = item.Attribute("key").Value,
                  Name = item.Attribute("max").Value,
                  Max = item.Attribute("name").Value,
                  Value = item.Attribute("value").Value
                };
IEnumerable<XElement> _baseStatsEl = _charInfoEl.Descendants("baseStats");
var _baseStats = from item in _baseStatsEl.Descendants()
             select new {
               Stat = item.Name.ToString(),
               Base = item.Attribute("base").Value,
               Effective = item.Attribute("effective").Value,
               Element = item
             };

I was quite impressed by the brevity of the code needed to get this. I still want to go back and clean up the web request to use some of WCF's new capabilities, but I think the LINQ aspects of the code really speaks for itself. The code that it currently takes in .NET v2 to crawl/navigate the XML files was much much larger.

 
Page view tracker