The Evil Little Developer

Plots, Schemes, and Plans to take over the Devleoper world.... Mu hahahaha


News

For all those who are interested, the .NET User Group Meetings here in Winnipeg are starting up again next Thursday, check out Winnipeg's .Net user group Home Page for details.

My Stats

  • Posts - 16
  • Comments - 12
  • Trackbacks - 0

Twitter












Recent Comments


Recent Posts


Article Categories


Archives


Post Categories


Blogs I Like


Cool Sites



Hey loyal, bored readers of my blog. First off, I'd like to apologize for not posting in a while, have been going through many personal issues in the last little while and haven't had a lot of time to post or to code.

Anyway, I finally did a commit of my Logging framework. This is a pretty major commit, many new features, including a central logging service. Prolly has a few bugs in it, but as my laptop is on it's last leg, I decieded to commit it before I lose it, so check it out on Codeplex, at http://evildevtoolbox.codeplex.com/ and post your comments!

One thing I did do recently, is I had a chance to attend the 3rd Annual Winnipeg Code Camp. First off, let me thank Darcy and co for all their hard work putting this together, it's a great event, lots of fun, and if I had one thing to complain about it would be that there was too many good speakers that I had a hard time decieding what presentations I'd like to see. I'd also like to say thanks to all the presenters, for sharing all of your experience with us.



Well, sorry I haven't posted for a while. Haven't really had much to talk about. My error logging framework is pretty much done, just gotta quit slacking off and package'er up nicely.

Anyway, guess to the point of my article (yeah the title is a bit confusing). Of course, before I get to the solution, let me give you a bit of background.

I've been doing Marketing Mass Emails (Eblasts) pretty much since I started working at this job. Never really had an issue, every once in a while something comes a long and breaks a perfectly good process (yes, I hate you Outlook 2007), but all in all, it's very simple to send HTML Email.

Well, last Friday, me and a co-worker were working late, trying to launch a similar system to our Eblast Engine, but instead this system just sends a simple auto-response email to people who register at our clients Kiosk. The creative agency failed to provide creative until the night before the system was supposed to go live, so we were on an extremely tight deadline.

Well, of course we're working late, shortly after 5PM we were ready to go live with this new thank you email system. Run some tests, spits out the eml files, great. View them, images work fine, links work looks exactly as it was intended from our Build server.

So, we continue down the QA/Deployment path. Everything works as expected on the staging server, so we launch it into production.

Run some tests fallrom the live tool, and I registered at the kiosk using my gmail account. Go to view the email, and none of the images show up. Not only that, there isn't even those placeholder images. Viewing the source reveals GMail stripped out all the images from the HTML document, leaving only the raw text.

Perplexed, I tried Hotmail and Yahoo. Same results, all images stripped out. Try my internal email, and woah, works just fine, images and all work great. So I was a bit lost, my first thoughts thinking "oh no, did we get blacklisted by the major email clients somehow?". Our mail servers have the correct certificates and reverse lookup etc.

We stayed until midnight, but could not get this thing to work. Spent all weekend googling, could find no reason why it would work in some clients (Shaw Mail and Outlook worked fine).

Anyways, this morning I was again working on it, trying to find what the problem was. Stripped the HTML down right to the basics, stripping out all but one image when it hit me. Right there in front of me, instead of your typical "<img" html tag, the html was all "<image" tags. I know, HTML 101, but keep in mind we were on a short deadline, and working late.

What bothers me the most, is why it worked at all. "<image" is not a valid HTML tag. Why does it work at all?? Well, only conclusion I can come to is, IE supports it. For whatever reason. Since outlook 2003 is rendering HTML with Trident, and we were viewing Shaw Webmail in IE, it's the only logical explanation, whereas the major webmail clients reformat the HTML, stripping out what they don't support.

 

RANT: Leave it to Microsoft to go against standard, and support a tag nobody else does. What advantage does supporting a non standard tag that does the same thing as a standard one? If it didn't work at all, a 2 second google search would point the amateur to the correct tag, and problem solved.

 

Anyways, thought I'd post that. I worded the title to optimize for google searches, maybe someone else will make the same noobish mistake, and I can help them out.



Let's face it, it needed a rename. Mitch.Web just lacks everything in terms of marketing, so I've re-branded my (currently error logging :P) framework to "The Evil Little Developer's Toolbox" in game with my EvilDev theme. I've also made advancements (not guaranteed to work yet) on my error logging framework, mostly in terms of a new Services Project, and the Logging Service. The logging service, is a WCF Service, designed to log errors to a database.

The idea behind it, well, I generally focus my efforts towards Web Applications, and one thing I've been looking for, and haven't had much luck in finding is, a standardized end-to-end error logging solution. I like to know when my javascript breaks, or my silverlight application has a heart attack. I like to know when my flash components fail horribly. Now, each platform has methods of error logging (let's face it, this isn't exactly a "new" concept). I haven't had much chance to play with WCF before this, so I figured I could kill two birds with one stone if you will.

Once I solidify my service code, (and hopefully find a pleasant way to make it easily redistribute), I'll set about writing libraries for the various platforms I plan to support (I want to be able to simply include a js file in my GlobalMaster.aspx for example, and have all javascript errors logged).

It's a rather simple Architecture, requiring only some basic error info/log message, and a Registered Application Guid (to ensure not just anybody can log to my service.

Anyways, if you feel like checking it out, codeplex URL has been changed (although apparantly the old url will just redirect), so check it at:

http://evildevtoolbox.codeplex.com/



Well, my logging framework is pretty solid I think, still needs further practical testing, but so far working alright.

Today, a co-worker proposed a challenge to me, in the form of a general comment. He mentioned how our current error logging framework at work functioned (we use ELMAH). Which got me thinking.

ELMAH works, by implementing an HttpModule, which catches web applications "OnError" event if you will, logs them and lets the app go on it's merry way.

Digging into HttpModules, I discovered that kind of functionality is extremely easy to implement, so I've added a new class to my framework called "HttpErrorLoggingModule" that implements the IHttpModule interface.

There's not much code, so if your interested just pull down the source of codeplex and dig into it.

I also enhanced my "GenericLogger" so now when logging errors it'll do a recursive write of all inner exceptions as well, and it checks if the Exceptions "Data" property contains anything, and write out all those values as well.

The reason I did this, is so my HttpErrorLoggingModule could then append data about the Current HttpContext to the exception itself to be logged, similar to the way Elmah records that stuff.

I know, why don't I just use Elmah? Partially because I've found with working with it, that there are some shortfalls, specifically, if there's a weird low impact exception being thrown, but it's thrown every minute or so, if an issue is already logged related to that exception it should not be spamming me with email. By building a similar module ontop of my own framework, I open that kind of flexibility up.

Plus, the core code is only like 30 lines long (if that), so it's not exactly complicated.
So if your interested, it's up on CodePlex here: http://mitchweb.codeplex.com/


Anyone, I'm going to challenge you my readers with something as well, cause for the life of me, I don't know how to do it.

I want to add this kind of functionality to my framework, for Console/WinForms/WPF applications as well, something that preferably wouldn't require a recompile of the client application, and could be setup merely by copying dll's and adding some configuration. I know it's easy enough to instantiate an error event handler in the main access point of the application, but I'm wondering if there's a way to do it without touching the client, like Elmah. Any help I'd greatly appreciate :)



I recently decieded to start merging some of my code that I use in a lot of my little projects into a centralized framework, and provide a consistant API for them. (As well as give me a reason to experiment with Visual Studio 2010 ^^).

So today, I released a pre-alpha version of the "Mitch.Web" framework, currently only semi-complete API is the ILogger framework, inspired by Uwe Schmitz demo presentation (with a few design/enhancements I felt were necessary).

API is similar to Uwe's, with a couple of key exceptions, instead of using Unity to auto construct the configured logger, I built a .NET Config Section/Handler for the configuration, and exposed it in a Global Module called "App". The advantage of this approach, is my configuration settings are a bit more flexible, and allow multiple loggers to be used at any given time, as well as referencing a specific logger by a key specified in the config file.

Configuration is highly dynamic, allowing you to specifiy parameters for your constructor, as well as providing parameters for parameters etc recursively instatiating all dependcies.

It does use reflection for instatiation, but currently it caches the final logger collection in memory, so it only instatates once. I plan to improve on this in the future for longer running process like services and web applications, in which I will throw it into a cache with a dependency on the config file the collection was instatiated from, so that if the configuration changes it will refresh the logger collection on the fly.

There are a couple other gems in there that are kind of neat, I'm going to be enhancing this framework for some time yet, but if you want to check it out now, in early development and provide feedback it would be most useful, especially this early in the life cycle. Not much documentation yet I'm afraid, but I promise before I release the full release, all libaries and API's will be fully documented.

So if your interested, it's up on CodePlex here: http://mitchweb.codeplex.com/

Couple of things to note:
- You need to download Visual Studio 2010 Beta 2 in order to open the source
- Written in C#, although maybe someday I'll create a VB version as well.
- Released under an MIT License.

Enjoy!



Well, today I had the honor of attending the first annual SDEC09 Conference hosted by Protegra. This event was similar to the Winnipeg Code Camp, where they had three trains of presentations going on all day. Well, it was a wonderful conference, well worth the $100 Early bird price, as I had a chance to sit in on some amazing presentations.

Let's take a look at some of the topics presented that I attended.

Introduction to Agile Developement - Presented By Steve Regalsky


Well, I've heard of Agile Development, especially recently, but I've not really had a chance to get into it all that much. I decieded to sit in on this presentation, as it is something I've been hearing a lot about recently, and my natural curiosity struck me to listen in.

Basically, the idea is to have a different, more flexible approach to software development, a method that welcomes change and takes iterative development to the extremes. Now, the way I interpret it based on the presentation, is essentially communication is key. I mean, duh right? Communication is something we must do, lack of communication often tends to lead to what being built is not what's requested by the client and projects get rejected. One of the things agile strives for is a very team centric development practise, not just a team of developers lead by a project manager, but have every participant from the client to the user to the developer all working in collaboration. This to me, just makes sense, I mean unless you have an opportunity to talk with the user how can you know what they want?

In my experience developing, typically it's a "no-no" to talk with the client. That's what MD and BA's are for. The BA delegates a requirements doc to the Project manager who refines it into a scope of work and then plans/passes the SOW to the developer who's job is to build it.

The agile approach is a little different, the requirements, and the SOW aren't typically used, instead your development should be designed and open to the changes of the business. Let's face it, a lot can change in a business in 3 months time, and on a long development project especially, what the needs of the business are at the start of the project, are not necessarily what's needed by the end of it.

Also, it is quite common for the client not to really have a clue what they want, they just need something. Agile strives to build small, short iterations and deliver a working prototype often and as quickly as possible, while leaving it open for adaptation. The sooner in a development life cycle a client can play with his new toy, the sooner you find out what he really wants and what doesn't matter as much to him/her.

Agile, despite popular belief, is not a "Defined Way to do things" but more of a strategic approach to solving a problem. Software development doesn't need to "follow the rules to the T" but just to encourage communication amoungst all levels of a project, to produce the most value with the least amount of code possible. It's not about delivering a specific project, sure in a perfect world when requirements are done up the needs of the business stay constant, but the reality is the needs of any business are constantly changing.

Lean Software Development - Kickoff To Deployment in 92 days - Presented by Terry Bunio

In this topic, the presenter, Terry, walked us through the steps they took to deliver a project to a client, applying Lean Development and Agile Principals in a real world example. He covered a lot of stuff in a broad spectrum of areas, and while I'd like to get more detailed into some of the topics, he did an excellent job of a highlevel process.

What I took back from this presentation is a deeper understanding of how Agile is applyed in a real world scenario, and I find it seems to rely heavily on a well assembled team. You need every member of the team to pursue a specific role, yet be well rounded enough to grasp all other areas of the development process.

As this topic was closely related to the first topic, I won't go into too much detail, but his presentation materials are supposed to be made available on the SDEC09 Website by Friday, I'll post a link as soon as their available.

Introducing Inversion of Control and the Microsoft Unity Application Block - Presented by Uwe Schmitz

First off, Uwe is an amazing presenter. I've been to a few of his presentations in the past, they are always very informative, and fun to attend. I had a chance to see him do some stuff with the Unity Framework at his last User group meeting, but in this presentation it was more the focus.

What I took back from this presentation, is surprisingly not that "unity is the answer to all your problems" but a more solid understanding of Inversion Control, and the importance of decoupling your code as much as possible. Unity, fits in really well with typical agile techniques, such as TDD, and mocking, and it decouples your code, removes dependencies and generally helps abstract away the how for the why. The idea is to make your code more change friendly, maximizing the use of interfaces and auto-instantion. Instead of asking for a FileLogger, you ask unity for a "logger" and it gives you an instance of ILogger that you can use for logging. This way, if the business requirements change, and say errors need to be logged to the eventlog, it's a simple configuration change and bam, it's no longer logging to a file, but logging to the eventlog, without the need to recompile. You can even drop an entirely new DLL into the BIn folder and configure it to use a 3rd party impementation of ILogger.

This is definately a topic I'm going to dig more into, change resilliant code is a requirement in todays fast paced business market, and the easier you can accept changes, the better it is for you and your clients, and that helps both you and your client to succeed. And that my friends, is what software development should be about. It the client isn't happy, then no matter how pretty your code, you did a crap job.


Aspect Oriented Programming Using Spring - Presented by Cory Maksymchuk

Well I'm typically not a Java developer, I haven't really touched java since college, but I took a lot out of this presentation. I think I overheard that it was Cory's first presentation like this, but although he seemed a little nervous at first, it was hard to tell. He did an excellent job of presenting, and was very knowledgable about the topic.

I believe the first time I heard about Aspect Oriented Programming, it was a presentation done by Donald Belchman at the winnipeg code camp, based on PostSharp. The idea behind it is, there's always certain parts of your application that can't be separated into specific layers, because they affect all layers of your application, called "Cross Cutting Concerns". These are thing such as logging, security, benchmarking whatever, things that should/may happen at all layers of your application.

This is a topic I'm really interested in, although I haven't come up with a personal oppinion on the best way to do this. What Cory demoed was Springs approach to solving this problem. Spring is a Java framework that injects code in at runtime, through dynamic inheritance. In some ways it's similar to Unity, in that it abstracts away class/interface through dependency injection. But it's also similar to Castle Windsor in that it's configurable, you can turn aspects on and off without recompiling, and you don't have to put your trust into a 3rd party library directly injecting code into your DLL. There are disadvantages, you can only apply aspect code to Public, inheritable classes, but all in all, looks like a worth while technology.

Estimating Using Planning Poker - Steve Regalsky

This was a really fun presentation. It wasn't really a presentation, but more like a hands on Lab. We were shown an Agile approach to estimating first hand, and it was lots of fun.

Of all the topics I attended today, this is the one that has the most potential to affect the way I work short term I think. Instead of the current system where the client asks for something, MD then sends the requirements to the BA who creates the SOW and then sends to the project manager who goes to the developer to get estimates, and then it flows all the way back up to the developer, Agile takes a different approach. Everyone is involved in the estimation of the project, from the developer to the client, and I think this is an EXCELLENT idea for any company. It also makes it fun, but using cards.

Essentially you get a list of "User Stories' form the client giving general advice on what they want, and then you discuss how much effort is involved to do each step. Not a time estimate, instead, you give them a rank on a point system, which groups scenarios into categories of similar workload.

Also, you get the entire team together, the client included, to rate them on complexity. Each member of the team selects a card with the number of points they feel each scenario is worth in complexity, and then everyone reveals their card. This sounds silly, but it's surprisingly effective, because for example, if the client gives a task a 1 in terms of complexity, and the developer gives it an 8, it sparks a debate with the client to bring awareness to how complex it is to build what seems like a simple idea to him, or on the flip side, perhaps the developer is over thinking the clients requirements, and the client will explain why he/she feels it's a simple task. This commication level is what I think is the greatest asset to Agile, and I think it's worth a shot to try out. I cannot see how this approach could not work well, although actually getting the client in on something like this could be a challenge.

Conclusion

In conclusion, I had a lot of fun today, from playin' with lego, to playin' planning poker, and just generally getting to talk with other developers from other companies, it was well worth my time there, and I'd go again in a heart beat.

This event was well worth it, and I will definately be back next year to attend. I'd just like to take the time to thank all the presenters for their wonderful presentations, my only regret is that I wasn't able to attend all the presentations, as I'm sure the ones I had to miss were just as interesting as the ones I attended.


I haven't had much to post about for a while, but yesterday I decieded I was going to take Keramic Koala, the next release of Ubuntu Linux for a spin. I have an old machine sitting around, and I wanted to turn it into a subversion server. Read more


Today, I was assigned a task at work, which involved taking a CSV format flat file and submit it to a third-party web service. Well the webservice that the data needed to be posted to, is not a .NET based webservice, so the hook-ups needed to be done manually.

The webservice is setup to accept an ISO Standard XML format called ADF, it's an eLead based schema used within the automotive industry to exchange prospect data from system to system. I took a look around Google, but wasn't able to find a .NET library for producing the format, so I set about writing my own. I was lucky enough to get an XDR Schema definition from the third party, which defines their implementation of the standard.

Turns out, there's a neat little console utility provided by Microsoft, in the form of the xsd.exe. One feature of this little tool is to convert XDR format schema declarations, into the more modern "XSD" format that is Microsoft's current standard. Another feature, is to take an existing XSD file, and generate .NET objects that serialize into XML honoring that XSD. Sure, the generated code isn't exactly the most api friendly (using arrays instead of generic lists), and it kind of forces you to initialize everything, instead of intuitively flowing.

Example:
I would like it more if you could do something like this:
Dim prospect As New Prospect()
prospect.ContactInfo.Emails.Add(new Email("something@somedomain.com"))

Instead it's more like this:
Dim prospect As New Prospect()
Prospect.ContactInfo = new ContactInfo()
Dim emails(1) As Email
emails(0) = new Email()
emails(0).EmailAddress = "something@somedomain.com"
Prospect.ContactInfo.Emails = emails

As you can see, it's quite a bit more code and effort, but at the convience of skipping the mundane, repetitive nature of creating your model classes. Especially for a quick and dirty importer tool that's only going to exist for 60 days.

One thing I should note, I have tried using the feature in visual studio to generate an XSD off an existing XML file. It's alright, but I find that the same feature in an app called XMLPad is substantially better. It's much easier to make tweaks to it to add enumerations and tweak xs:datatypes.

Anyways, this is one of those hidden little jems that ships with .NET that I felt I should share. This tool is definately worth a looksy, and why they don't just build a feature like that inside visual studio escapes me completely.


Well, this isn't going to be a long post, but I recently had an experience at work that enlightened me to just how good the Support @ Microsoft really is.

A Little Bit of Background

Well, a little bit of history on this topic. At work, it's kind of a tradition, as it probably is at many organizations, that when someone leaves their screen unlocked that you change their desktop wallpaper and lock their computer for them, just to kind of remind them that they forgot to lock their screen, and comically embarrass them a bit.

Well, there's a new guy at work, he's been there about 3 months, and he has a bad habit of leaving his screen unlocked. Well, naturally, someone changed his wallpaper, to a picture of a Shirtless David Hasselhoff lifting weights, and tiled it across both his screens.The Hoff Loves You

Well, needless to say this was quite humorous, and naturally he laughed and logged back into his computer. He then proceeded to change his wallpaper back to what it was.

To his dismay, for some reason whenever he locked his screen, it still showed the tiled picture of the hoff across his desktop, despite changing his wallpaper.

What to do?

Well, what any usual course of action to combat the Hoff invasion, you'd have expected his first move to do some google searches to see what needed to be done to change this back. Well, he had another idea. That's right, he decided he'd skip the googling and go straight to the source of the problem. He emailed support@microsoft.com as follows:

Dear Microsoft,

 

Recently, my wallpaper was changed to a tiled picture of a shirtless David Hasselhoff. After changing my desktop picture, I have noticed that my lockscreen still displays the Hoff, and he’s still shirtless.  How did it get stuck there?

 

Did windows recognize the Hoff and decide that it liked it so much that it should remain my lockscreen background forever? Is this some undocumented feature of Windows Server 2003?

 

Any information on the subject would be greatly appreciated.


And he blind CC'D most of the dev's at the company. It was freakin' hillarious. He did eventually figure out how to get rid of the Hoff. However, this is not the end of my little tale. See the best part, is the fact that in under 24 hours, Microsoft sent him a response!

Hello _______,

 

Thank you for contacting Microsoft Customer Service.

 

I understand from your e-mail that you are unable to change the wallpaper on your Windows Server 2003 computer.

 

There are several ways to obtain support:

 

You may search for self-help articles to resolve your issue:

http://support.microsoft.com/ph/3198

 

You may also post your issue in the Microsoft newsgroups:

http://technet.microsoft.com/en-us/windowsserver/bb430837.aspx

 

If the Microsoft Windows Server 2003 came from your computer manufacturer, they are your primary option for support:

http://www.support.microsoft.com/default.aspx?pr=oemphone 

 

_______, you may also work with a Microsoft Support Professional via e-mail, telephone, and for some products, chat to resolve your issue. Please select the appropriate edition of Windows Server 2003 from the below link to contact the Support Professional. Depending on how you obtained your software, there may be fees to use the Assisted Support option: https://support.microsoft.com/oas/default.aspx?ln=en-us&x=14&y=13&c1=508&gprid=3198&&st=1

 

I hope the issue is resolved soon and appreciate your patience.

 

Thank you,

 

Sandeep

Microsoft Customer Service Representative

 

If you have any feedback about your Online Customer Service experience, please send it to my manager, Harpreet Singh, by clicking the link below. Please be sure to include the name of my manager in the subject field.


Now that's what I call impecible customer service! I must say, with confidence this is a definate WIN for Microsoft!


Well, today I spent most of the day, trying to find an alternative way to render an SSRS Report to the page, other than the report viewer control. Based on a comment on my last post on this, I decieded to dig into the ServerReport.Render function.

Well, this sounded/looked promising, and I was quickly able to write a neat little wrapper object, exposing the various formats as properties. I then proceeded to create a special IRequestManager for reports, and some other stuff to nicely integrate it into our existing infrastructure.

I wrote a couple unit tests to test the wrapper, and after a couple minor bug fixes I was ready to rock. I threw together a quick and dirty XSL page, and decieded to go to town and see if I could get a report to render. Well, turns out, there's a little known hitch to this method that isn't easy to find on forums and blogs. It works just beautifully for the PDF/Excel/MHTML output formats, once you have the right headers in place, and Response.BinaryWrite(Report.PDF) etc to the page, it prompts the user to download the pdf, open it and looks great.

But, again, where the kick you when your down, is the HTML rendering. If you try the ServerReport.Render("HTML4.0") method, it fails to render any of the images in the report, and none of the Drill downs/hyperlinks work. Well, I decieded to dig into it, and figure it out. After a couple painstacking trial and error runs, and googlling, still no luck.

I eventually stumbled onto a blog where someone referenced that it wasn't possible to render the images with the server.render, you needed to use server.renderstream functionality. After some more frustrating trial and error and googlling, I finally figured out the issue. Turns out, SSRS renders images in different streams than the html, but that Server.Render returns the Stream ID's of the additional streams, and with a little bit of TLC, you can write those images to files. Tweak the DeviceInfo XML to change the StreamBase to the base path of where your dumping the images, and it works.

CODE EXAMPLE (And yes, it's in VB.):
Dim rv As New Reportviewer
Dim DeviceInfo As String = "<DeviceInfo><StreamBase>PathToMyPage/Images/</StreamBase></DeviceInfo>
Dim StreamIDs() As String
Dim HTMLBytes() As Byte

With rv.ServerReport
.ReportServerURL = "http://myserver/reportserver"
.ReportPath = "/MyPath/MyReportName"
HTMLBytes = .Render("HTML4.0", DeviceInfo, Nothing, Nothing, ".HTML", StreamIDs, Nothing)
For Each streamID as string In StreamIDs
Dim ImageBytes() As Byte = .RenderStream("HTML4.0", streamID, DeviceInfo, nothing, nothing..)
Dim fs As FileStream = File.Create("HardDiskPath to Images Directory used in DeviceInfo/" & streamID, ImageBytes.Length)
fs.Write(imageBytes, 0, ImageBytes.Length)
fs.close()
Next

Response.ContentType = "text/HTML"
Response.Expires = -1440
Response.Write(System.Text.UTF8Encoding.GetString(HTMLBytes)
Response.End()
End With

NOTE: The above Example is strictly from memory I don't have code in front of me, so I may not have called exactly the right functions, but should give you a good idea what I'm getting at.

This still doesn't fix the issue with the drill downs not working, and for now, I don't think we are going to go this route, we'll stick to having the page post back and using the report viewer control. I eventually may dig into this again, as it bugs me. I also don't feel it's a good Idea to be dynamically writing images to the fillesystem on each report request, and the above code is not designed with concurrency in mind, but I figured I had so damn much trouble getting this kind of working, that I'd help the community out and post my findings. Also, it's better to add a web reference to the Reporting Services Web Service for it's Render and RenderStream Methods, and maybe I'll talk on that more some other time.

If anyone knows more about this stuff, I'd love to hear what solutions you have come up with.