For the first time in almost a year, I had to do some BizTalk development (actual BizTalk development, not the support tool I wrote about previously) to support our old system. We were making a change to one of our schemas, but need to send a message that conforms to the original schema version on one of our send ports. The easiest way I could think on how to accomplish this, would be to add a map on the send port that transforms the message from the new schema to the old schema. Seeing as I’m was a little rusty on my BizTalk dev skills, this took a little longer then expected. First, the schema I was dealing with had an element comprised of child elements, whose Group Order Type property got changed to sequence. This resulted in errors such as “Element E1 has unexpected child element E2 in Schema, list of possible elements include E3”. It would be nice if the error message was a little more clear. I even ran the schema thru a web based XML validator I found and got the same error message, so that must an error message in the XML spec. I finally figured out what was going on by looking at a sample XML message created using the Generate Instance fucntion and saw that only 1 of my “required” elements was showing up. Changed the Group Order Type to sequence fixed my problem. With my test message passing the schema validation, I moved on to creating the map. I created a new assembly to hold the map, as well as the destination schema type. I then referenced my existing assembly to get the source schema for my map. This was pretty straight forward, and I was able to build and deploy my updated and new assemblies to BizTalk. Trying to keep things simple I set up 1 receive port/location and 2 send ports along with some content based routing. On one send port, I applied my map, and the other I did not. After sending a test message thru, I saw that both my send ports produced a file, but neither were transformed as expected. Turns out I forgot to set the receive pipeline to XMReceive…I know I’m a bit of a BizTalk newbie sometimes. You do not need to change the pipeline from pass-thru on the send port, just on the receive location. After correcting this, my message suspended out with the error: “Cannot locate document specification because multiple schemas matched the message type http://Fully.Qualified.Schema#RootNode.” This makes sense, as all I did was copy/paste my original schema to the new schema file to preserve the existing structure, and then modified the original file, adding my new elements. I also needed to modify the schema on the new version, indicating a new version (which we happen to include as part of the namespace). At this point things started working as I had originally envisioned. BizTalk is not something I can quickly jump back into for some reason. There is a bit of ramp up time to get back into the swing of things. I should probably go find some more BizTalk stuff to fix while I’m in the right frame of mind.
Merry Christmas to me, my Dell Mini 9 arrived today. I ordered it with a 16GB hard drive and 1GB of ram and Linux. I have plans of installing Windows 7 beta after I get it from attending MSDN Dev Con next month, but there was no way I was just going to wait around with the mini not in use until then. The mini does not come with an optical drive, nor do I have access to a USB optical driver (although it might be a wise investment), so I needed to learn how to install from a USB storage device. While I found numerous how-to’s, the following You tube walk thru, which uses a utility program from this forum http://www.boot-land.net/forums/?showtopic=4900 is the best way to go in my opinion. It takes care of formatting your USB device, coping files from your Windows XP CD or other location (i.e. if you use a program like vLite to create a stripped down XP install), and setting values for the unattended install answer file (a real bonus feature). Once I found the tool, it was pretty easy to get XP installed, and once XP is installed, it’s like any other computer, where you can just copy your network drivers from a standard USB thumbdrive, then access the rest of your files via your network. I also installed an ISO mounting tool to install applications like Microsoft Office which I store as .Iso. So far I have the following installed: - Office 2007
- Live Mesh
- Live Writer
- Combined Community Codec Pack
- Pidgen + Simp
- Foxit PDF Reader
Spent all day yesterday at the in-laws watching movies, surfing the Internet and reading some e-books and the mini worked like a champ. Battery time is around 4 hours which is pretty good on wi-fi, given the small, lightweight form factor. I can get over 3 hours on my wife’s new Dell studio 17, but it weighs in close to 9 lbs. I’m going to keep the mini at work and try to take meeting notes on it, hopefully being able to ditch my pen and paper. I’m also looking for some type of mounting hardware so I can mount it on the station bike I use so I can use the mini to watch movies during my 2 hour endurance rides. I currently have an older 14” laptop that I take with, but I could easily get 4 hours worth of video playback time out of the mini if I turn the Wifi off. If I’m able to mount it to the station bike right in front of me, the 9” screen will be more then big enough. I am very happy with my Mini so far, and I am looking forward to running Windows 7 on it in the near future.
Opened up my OneNote notebook today on my primary work computer and noticed all of the notes I had entered over the weekend were not there. Reviewing the news tab on mesh (local copy), I saw that my last update was 4:37pm, but couldn’t figure out what the date was. I was able to correlate the times with the date/times shown on the full news feed on the Live Mesh desktop and figured out that I stopped syncing sometime last Thursday. I was able to add news entries locally, but they wouldn’t show up anywhere else, and no changes made on my work computer would sync to any other location, in addition to my work computer not receiving any changes. I have another computer here at the office with Mesh installed, and it was working, so thankfully the IT staff at our parent company didn’t block another service at the firewall. Here are some of the things I tried: - Sign out and then back in
- Sigh out and exit and restart Mesh
- Set Work Offline on/off
- Reboot computer
Starting to get a little annoyed at this point. Looking at task manger, I could see both Moe and MoeMonitor there, but they wouldn’t do anything. Usually at start up they chew thru quite a bit of CPU. I decided to try to remove the sync setting for one of my folders, but got the error “503 Mesh service not available”. There was not much help via a Google search on the error message so it was time to resort to a reinstall. At first I tried the repair option offered in Add/Remove Programs (or what ever it’s called in Vista/Server2k8), and that more or less failed. It looks like it partially uninstalled, so I just went back in and did a full uninstall. Then I downloaded the 64bit client and re-installed. Thankfully I’m back up and running and things seem to be working OK at this point. I’m hoping my conflicts were minimal. I read that there will be an update after the holidays with better conflict resolution which will be cool.
Did a 1500m swim test today and set a new personal best of 34:17, shaving another 45 seconds off my previous best. To put that into context, top pros swim 1500m in open water for the Olympic Distance Triathlon in about 18 minutes. So while that is probably outside my reach, getting down to 30 minutes seems like a reasonable goal, with a 25 minute time a stretch goal. Today, after watching my wife swim a couple of laps, I as able to better visualize what I was feeling in the water. Sine we are both starting out, we are making allot of the same mistakes. After my 1500m, I swam a couple of laps where I forced myself to go slow, and really try to focus on my technique. To my surprise, even though I thought I was going really slow, I was doing 25m in 30 seconds, which is the pace I need to hit my 30 minute goal. You read allot about technique over raw speed, but most of the time (at least for me), I don’t believe it until I have some first hand experience, which I think I got today. It’s a fairly large psychological breakthrough, and I believe it will help me focus during future workouts. Some key points in my technique that I was able to put together for the first time today were: Full extension, shoulder rotation, smooth hand/arm entry setting up for my s-stroke. The pool is closed on Wednesday (my usual swim day along with Sundays), but my parents have an indoor pool at their condo and I’ll be on that side of town anyway. It’s probably closer to 10-15m, so I’m thinking of technique drills followed by lots of short sprints for the intensity component. Maybe I’ll swim around the edges to get more of a feel for a long distance instead of laps, as I always touch and stop at each end (still haven’t learned the flip turn). Biking and running are coming along nicely as well. While I had a DNF during last weeks two hour endurance training (had to stop at 1 hour 47 minutes), I was averaging 227 watts. This week was a little better, as I finished very strong, but I had to stop at the 1 hour mark to use the bathroom. I’ve slacked off a bit on the intensity component for biking, while training to squeeze more running in, but I think I’m going to limit my running to one time per week until these shin splints clear up. Even though the shin splints are annoying, I was able to set a pretty good pace on Thursday, running on the treadmill for 30 minutes covering 4.5 miles (6:40 mile, 9 mph average). I would do 1 minute of 9.5-9.6 mph followed by 30 seconds of rest at 8.1 mph. This worked out really well, and I think I’ll keep working with this format to build up my speed and endurance. I’m really looking to getting back outdoors for biking in the spring. I didn’t do any biking last winter, and my workout routine was sub-par compare to what I have been doing since April. I remember getting on my bike the first time and taking so long to bike to work that I was really disappointed (although it was maybe 50 out, and I had a strong head wind). I was able to build myself back up during the summer, but still couldn’t do much better then 21 mph average over my 12.5 mile route from my office to home. I’m really looking to a 24 mph average over that 12.5 miles in the early spring, and then keep that pace for 24-25 miles for the triathlon. I don’t know if that will be possible without more aero tires and at least clip on aero bars, but I’ll give it a try.
This morning I was greeted with a proactive alarm email stating that we had over 100 messages in our BizTalk suspend queue. What an awesome way to start my Monday morning. Sure enough, the Biztalk admin tool showed the messages suspended out starting around midnight, which first made me think that maybe somebody made a change somewhere. If you couldn’t tell from the title, the error message in the Event Logs as well as the Admin tool was: “The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel” (this is on a HTTP send adapter by the way). The first thing I did was attempt to browse to the destination URL in IE from the BizTalk server. Everything worked, no errors or warnings, but here is something intesting the cert was recently issued last week. Now why would it take a week to start seeing errors, unless it wasn’t installed until last night? Sure enough, heard from customer that maintains the destination server, and they updated their cert over the weekend. So why was BizTalk having problems, but IE wasn’t? It appears, that BizTalk must do some sort of caching, either on the cert or the HTTP connection. I’m not exactly sure what it does, but after restarting the host process, everything work fine. All the messages were resumed without issue and we’ve had no more suspend out.
Have you ever had one of those days where you just want to give up your job in computers/technology and go get a job at Walmart? I had one of those today, and I'm not even at work. I was just trying to setup some virtual machines to work on some projects at home, and nothing went right. First I tried to install 8GB of ram into my main workstation at home. That failed and took me a couple of hours to figure out that I needed to manually adjust the memory timings and voltage in order to get all 4 stick of ram to work. Along the way I thought I would update the bios to see if that work, and ended up removing my raid-1 array from existence. I didn't see the warning on Gigabyte's page about re-enabling the Raid setting, but I did see it in a forum post, however I forgot to actually do this. So on the one hand it's party my fault, but on the other hand I think it's poor design that the Raid setting get's set to disabled on a bios update. I didn't realize that I was missing my raid array for 4 hours or so. In the meantime, one of my other computers blue screened on me with a stop code of 1a while trying to copy a base VM image. Nice. I think I'll leave that alone for awhile. Actually I was able to make some decent progress on getting my VM's setup on my primary workstation, until I realized I had a G drive, that had the exact same contents as my mounted data partition, that used to be my Raid array. Oh crap. Rebooted and re-enabled the raid setting, and the array definition was still intact thankfully. Back into windows and I still have a G drive and my mounted partition is no more. Spent some time and a couple of reboots to get my Raid array mounted to an "empty folder" like I had it before. The raid monitoring utility said that everything was working, but I started getting errors popping up saying that I needed to run chkdsk. Again, several reboots later, I was able to run chkdsk and not get any errors. Final problem was that allot of my NTFS security permissions got messed up as well. I think it's all better now, as I was able to perform a defrag, and I'm running the raid application's analyze and repair utility as well. If I run into any more problems I'm going to have to backup 500GB worth of data and reformat. Now on another PC, I was trying to setup Virtual Server, and the VM won't start, and pretty much crashes virtual center. Guess I'll try VMWare server instead. Oh, and since I have a share on my primary workstation, which resides on my Raid Array that is part of my Windows Media Center library, Windows Media Center was pretty much non-functional until after it was back online. It just sat there trying to connect to a non-existent share....brillant. How do you explain that one to the wife?
In part I, I talked about how I had a need for a way to managed suspended messages in BizTalk using something other then the BizTalk Administration tool. Using a combination of BizTalk dll’s I was able to query, read and suspend BizTalk messages. The need for a “web” based tool is one of accessibility to our BizTalk server from remote machines that are not directly connected to the DMZ zone that they reside in. I’ve also been wanting to create a tech support tool for myself to manage other aspects of our hosted solution, and this would fit in nicely with it. Being a glutton for punishment, I decided to sacrifice my weekend and go for the more complex, but really cool sounding idea of a set of web services that interface with SilverLight 2. I choose SilverLight as I’ve been wanting to get my hands dirty with it for some time, and another member of the team was talking about doing the same, and what’s a little friendly competition? While I had a grand vision of what my tool would look like, which I will refer to as the Unified Administration Tool (UAT), I knew I wouldn’t be able to code everything in one weekend. I had to set some realistic goals and try to add only what was needed, while still allowing for future functionality to be “plugged-in”. The good thing was, since this was pretty much just for me, I didn’t have to worry about other peoples requirements ;) The UAT is an n-tier application which will provide administrative functionality over our hosted solution that is distributed among several servers in different DMZ zones (as mentioned in Part I of the BizTalk Web Admin). In addition to dealing with the distributed nature of our servers, the tool must also account for the various environments, with one environment consisting of an instance of our solution deployed across one or more servers. Perhaps to put this more simply is that I wanted to be able to perform the same functions on our development, staging, demonstration and production environments. I started out by created a new project folder to which all my various Visual Studio projects will be added. I moved my BizTalkUtilities projects into the Components folder as shown below, and then started adding the other components and UI projects as needed. Below is an overview of how I have my solution folder setup, which will probably change over time. The idea is that Components are reusable across all the UI and Services, and will probably have some more domain specific wrappers. Controllers under UI will be re-usable across each of the UI projects and provide an interface between the components and the UI. - UnifiedAdmin
- _Solutions
- Components
- BizTalkUtilities
- BizTalkUtilitiesTest
- Documentation
- Scracth (Prototypes and other throw away code used for quick tests)
- BizTalkMessageBrowser (Test win forms app for BizTalk Utilities)
- Services
- UI
- Controllers
- Silverlight
- SilverlightMobile (Future project)
- WPF (Future Project)
I decided that I will use the Entity Framework as my “ORM”, combined with Ado.Net Data Services as my primary web services mechanism. Combined with Silverlight, I’ll get to tackle three new technologies at once, and either learn allot, or give up, ultimately frustrated, wishing I would have chosen a few older tried and true technologies. Before we even get to the UI, I needed to start setting up my services and entity model. I have a feeling I’ll be re-arranging some of these projects, but for now I have a class library called Entities under Components, and a web project called UnifiedAdminService under Services. I really don’t know what the best practice way for organizing my entity models are, and it seems like one entity model per project seems a bit of an over kill, however, putting all the entities I will be working with in the same project doesn’t seem to smell good either, as there defiantly a clear break between them. I started out with an entity model for a database called Utilities, which will be the “glue” that holds my Unified Admin tool together. It’s sort of a catch all database that currently contains tables for some SQL based monitoring I have setup, as well as users (who can access the UAT), and servers (what servers does the UAT work with). I created a new Ado.Net Entity data model and had it auto generated the model from the database schema. This was pretty easy and straight forward. I prefix all my table names in my schema with various prefixes for grouping and identification, such as “mon_t” which means the table is used for the monitoring functionality, and it’s a table. I don’t want these prefixes in my code, so I am going to rename the entities in the model. To start with I’m only renaming a couple until I see how the EM is updated and used throughout the code. Next I created a new Ado.Net data service in the web project. This created a new .svc file with a code behind file that inherits from DataService<T>. I updated T to reference my entity model (Entities.UtilityEntities) and also configured the security to allow read access for entities. You do this by using the config.SetEntitySetAccessRule method in InitializeService. public class TsiUtility : DataService<Entities.UtilityEntities>
{
// This method is called only once to initialize service-wide policies.
public static void InitializeService(IDataServiceConfiguration config)
{
config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
}
}
Even thought the auto-generated comments for InitializeService make it sound like it’s only called once in the life-cycle of an AppDomain, I wasn’t sure. This post talks a little bit about the InitializeService method, and does in fact point out that the InitalizeService method is only called once.
I attempted to browse to my newly created service and was greeted with an un-informative error, “The server encountered an error processing the request. See server logs for more details.”. Since I’m running the development server that’s included with Visual Studio, there are not much in the way of server logs (that I could find anyway). Jumping into debug mode showed that the error was caused by an incorrectly configured connection string. The connection string used my the Entity Framework is not your standard connection string, so you need to make sure that you copy the connection string created for you in your Entities project to your web.config in your web project (assuming your entity model is in a separate project). I was trying to use the Server, Database, Trusted_Connection syntax, and apparently that’s not OK. Example connection string:
<add name="TsiUtilityEntities" connectionString="metadata=res://*/TsiUtility.csdl|res://*/TsiUtility.ssdl|res://*/TsiUtility.msl;provider=System.Data.SqlClient;provider connection string="Data Source=Server;Initial Catalog=Utility;Integrated Security=True;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
Once I had the correct connection string, I was able to navigate my entity model using just my browser. Of course I haven’t done any type of authentication, and I don’t want to have just anybody browse to the URL for the UAT and start browsing, so it’s time to add some security. Ado.Net data services makes use of existing security provides as long as they set the HttpContext principle, so you can use HttpContext.Current.User.Identity.Name and then compare that against records returned by the EM. Something that I didn’t fully grasp at first, was that by the time Ado.Net Data Services “takes over” the user should have been authenticated, so there really is no “login” event in Ado.Net data services where you can set additional information.
For simplicity, I decided to use Integrated Authentication, and store additional information after the user is authenticated. Since this is a regular asp.net application, you can add a Global.asax, and add code to the AuthenticateRequest event handler to perform additional security related code. When AuthenticateRequest is called, whatever mechanism that is configured to handle authentication has finished, and there should be a value in HttpContext.Current.User. What I did was user the Name property to query my users table that was part of my entity model and cache the results in a hash table, which itself is stored in the application context. If the user does not exist in the database, I set the Current.User to null, and cache a null value with the key of the user name that was authenticated.
protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
string userName = HttpContext.Current.User.Identity.Name;
//Get a collection of cached users. If it doesn't exist create and cache it.
System.Collections.Generic.Dictionary<string, Entities.User> users = (Dictionary<string, Entities.User>)HttpContext.Current.Cache["Tsi_Users"];
if (users == null)
{
users = new Dictionary<string, Entities.User>();
HttpContext.Current.Cache.Add("Tsi_Users", users, null, DateTime.Now.AddHours(1), System.Web.Caching.Cache.NoSlidingExpiration,
System.Web.Caching.CacheItemPriority.Normal, null);
}
Entities.User user = null;
//Check to see if we have a cached user for this username. Use ContainsKey as we will store
//a null value to indicate a user is not authorized.
if (users.ContainsKey(userName))
user = users[userName];
else
{
Entities.TsiUtilityEntities entities = new Entities.TsiUtilityEntities();
user = entities.UserSet.FirstOrDefault(u => u.WindowsUserName == userName && u.IsEnabled == true);
user.ua_tx_UserServers.Load(); //load servers this user has access to.
}
//User doesn't exist in the database either, so un-authenticate them
//allow to continue thru so we add a null object with the username to cache
if (user == null || HttpContext.Current.User.Identity.IsAuthenticated == false)
{
//When this is set to null, this method should finish, but no data will display.
//Seems like aspx pages will still display though. However if you check the CurrentUser
//it will be unathenticated.
user = null;
HttpContext.Current.User = null;
}
//save to users collection. Double check to make sure it wasn't added somewhere else.
if(users.ContainsKey(userName) == false)
users.Add(userName, user);
}
What I have not decided upon, nor have I done the research into, is if I should be caching the DataContext in the application or session cache for the user.
So where does this leave me? Well, I certainly didn’t get even close to what I wanted to accomplish in one weekend, as I haven’t even touched SilverLight yet. I do have some basic authentication, but that’s more using traditional asp.net then doing anything special with Ado.Net data services. From the looks of it, I will have to add QueryInterceptors to every entity I wish to do security on, which seems like a pain and allot of extra un-necessary work. Next time I hope to accomplish the following:
- Research to find out if you should cache the data context
- Write out security requirements and research the best way to implement in Ado.Net Data Services
- Figure how I am going to have one set of services that can connect to multiple databases (assuming the database schemas are kept in sync).
It’s been awhile since I’ve done any BizTalk development since my last project got canceled. However, we are still using BizTalk, and with that comes administration. One of the more tedious tasks is responding to suspended messages. There are a couple of common tasks that I do when I see that a message has been suspended. - Resume because a destination location that was unavailable is now available (i.e. Customer Web Service)
- Terminate instance because it’s not a critical message and do nothing else
- Terminate instance, then fix and resubmit message
While BizTalk provides the BizTalk Administration tool in BizTalk 2006, which is a much needed improvement over the tools in BizTalk 2004, it leaves something to be desired. What I would like is a web based tool to manage my suspend queue, with some additional logic for filtering messages, so I can quickly determine if I need to terminate or resume. I’d like a web based tool, because I don’t have direct access to the SQL server that BizTalk uses as it’s in a DMZ. A web tool would allow me to manage the suspend queue from anywhere, even from home. After a bit of searching, I didn’t find anything else out there that fit my exact needs. There was a project on CodePlex that looked like it might have been a good start, but didn’t look like it had suspend queue management (but it did look like it had support for configuring the various artifacts, like ports, orchestration, etc). I decided to write my own, as with most endeavors, it would serve as a good learning experience. While searching for an already made tool, I found several references to Microsoft.BizTalk.Operations for getting messages out of BizTalk. After playing around for a bit I got something working that returns me a list of suspended messages. using Microsoft.BizTalk.Operations
...
Operations operations = new Operations("localhost", "BizTalkMgmtDb");
List<BizTalkMessage> suspended = new List<BizTalkMessage>();
foreach(BizTalkMessage in operations.GetMessages().Cast<BizTalkMessage>())
{
if ((msg.MessageStatus & MessageStatus.SuspendedAll) != 0)
suspended.Add(msg);
}
return suspended;
I found out that I needed some other Dll’s as well:
- Microsoft.BizTalk.DBAccessor (pulled from GAC)
- Microsoft.BizTalk.Operations (%Program Files%\Microsoft BizTalk Server 2006\)
- Microsoft.BizTalk.Pipeline (%Program Files%\Microsoft BizTalk Server 2006\)
- Microsoft.BizTalk.Tracing (pulled from GAC)
- BTSDBAccessor.dll (non-managed code. Add to project and set to copy to output directory)
Since I’m using BizTalk dll’s that are only available by installing BizTalk sever, I won’t be able to redeploy those, so you’ll have to add them your self and rebuild the project. So yes, eventually I’d like to release the source for this little project.
After I was able to get references to the suspended messages, that left inspecting the messages to get various information, like why it was suspend, and the actual message body, and finally executing the resume or terminate command.
Resume and terminate are really easy, as once you have the message, you can just use it’s InstanceId property and pass it to operations.ResumeInstance or operations.TerminateInstance. Getting the message body is a little more difficult, but not that bad.
public static string GetMessageBodyAsString(BizTalkMessage message)
{
string body = string.Empty;
using (System.IO.StreamReader reader = new System.IO.StreamReader(message.BodyPart.Data))
{
body = reader.ReadToEnd();
}
return body;
}
Ok, so it wasn’t that easy. When I went to run my code I got the following error when trying to access the Message.BodyPart property of BizTalkMessage: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B) – Microsoft.BizTalk.Pipeline. I thought that maybe I had an incompatibility between RTM and R2 versions of the various DLLs. Well, I fixed that but the error persisted. It was at this time I realized that the unmanaged code (BTSDBAccessor.dll), might not be compatible with my 64bit operating system. So I tried running this on a 32 bit box, and got another exception that indicated that I was most likely missing a dependency for BTSDBAccessor. Finally, I ran the code on a 32 bit box that had BizTalk installed, and it worked fine.
So you might be asking yourself, why wouldn’t you run this on the BizTalk box? Well I want this to be accessible via the web, and our BizTalk box does not do any front end web hosting, that is handled my a separate set of machines in another zone. I also wasn’t planning on installing BizTalk on the front end web servers either, so I needed to come up with a work around that avoided a BizTalk install. Using ProcessMonitor, I was able to come up with a list of dll’s that my application was accessing, which I have listed below. These dll’s reside in %Program Files%\Microsoft Biztalk Server 2006 on 32 bit systems, or in a bin64 sub-folder on 64 bit systems. Some of the dll’s need to be registered using regsvr32.
- BTSCache.dll (regsvr32)
- BTSDBAccessor.dll
- BTSErrorHandler.dll (regsvr32)
- BTSMessageAgent.dll (regsvr32)
- BTSPerfCounters.dll
- BTSSchemaCache.dll
So now I have my test app running on a 64 bit install of Server 2008, just like my web front end servers, and I am able to query messages, find the suspended messages, and terminate those messages that are suspended. My next step, and topic of part 2 will be turning this into some type of web based application. I haven’t decided if that will be Asp.Net, Asp.Net MVC, or Win Forms using WCF web services.
UPDATE:
I was having some problems registering the unmanaged DLL’s on another Server 2008 machine (error code 0x80070005), which seems be an access denied error. I should point out that I was using a batch file to register all of the dll’s, which I also tried doing a run as Administrator. That failed, but with a different and even less helpful error message. I eventually opened up a command prompt as an administrator and manually ran regsvr32, and that seemed to work.
Previously I talked about how Sony Vaio laptop’s have the hardware assisted virtualization (VT) flag locked off, which means no Hyper-V. I took the Sony back and spent 2 hours at Best Buy with the wife looking for a new laptop (I really wanted her to see what she was getting), and settled on an HP dv7-nr1025nr. - P8400 Core 2 Duo
- 4 GB of Ram
- 320 GB 5400 RPM Hard Drive
- NVidia 9600 GT 512MB
- 17” @ 1680x1050
- Altec Lansing Speakers w/Subwoofer (these actually sound good in a quiet room).
Overall, a solid machine, and the wife really liked the 17” display, as she realized the larger display would allow for more content on the screen at one time, which is good when doing remote tech support (which is what she has to do sometimes). I still like the physical characteristics of the Sony, but at least HP doesn’t cripple the processor, and the video card is a lot better. Upon arriving home, I see a Dell flyer in the mail advertising Studio 15 and 17” laptops with discrete video cards on sale, and promptly throw it away, thinking “don’t need this anymore”. I plug in the HP and turn it on, and am greeted with a blue screen, stop code 0x7E. No problem I think to my self, probably a bad driver or something, I’m going to reformat anyway. I actually executed the built in system restore so I could create restore DVD’s, allowing me to reclaim all my HD space. After the restore DVD’s were complete, I ran memTest86 for 12 hours and then proceeded to install Windows Server 2008. No problems, got everything installed, hyper-v running, all is good. Since Hyper-V disables standby and hibernate, if you leave the laptop unplugged while running, you will drain the battery, which is what the wife did Tuesday night. We plug it in, turn it on, and bam, blue screen, stop code 0x7E, now that’s interesting I say to myself. Turn the machine off, wait 30 seconds, turn it on, works perfectly. Shut it down, reboot, update the bios, etc, working fine. I decided to shut it down before I went to bed as a “final” test, and was rewarded with a 0x7e blue screen the next morning. I spent some time analyzing the MEMORY.dmp file using WinDbg, as I’ve always wanted to try that out, but I couldn’t figure anything out. Usually you should see some type of driver implicated, but I didn’t. I made the decision that it just wasn’t worth it to screw around with this problem on a new computer, so back to Best Buy I went. When I returned the Sony, I said I didn’t like it, and no questions were asked (maybe cause I said I was going to do an exchange). This time I said it doesn’t work, and my reward for being honest was a 10 minute detour to the Geek Squad bench to have them “check it out”. After explaining 3 times to the “technician” what the symptoms were, he promptly says “I think I know what it this, it’s a bad video driver”. I knew better then to open my mouth, and just let him turn it on, and the laptop did not disappoint, it blue screened on cue. So I’m thinking to myself, sure wish I had that Dell flyer I got last week. Thankfully Dell finally has the Studio laptops with the discrete video cards on their site (again), so I think I’m going to go with one of those. At this point I’m trying to decide if it’s worth the extra $$ to go with the uber 1920x1200 RGB LED display or not. They also have the Mini 9 for $99 deal, and I can’t pass that up, although I have to add an extra $125 to get 1GB of ram and the 32 GB SSD. Look for a future post on how this all ends, and a review of the Mini 9.
After spending some time (obviously not enough time) searching for a new laptop for the wife (and yes, a little for me) I settled on a Sony Vaio FW-139 that was on Best Buy's outlet center. It had a newer Intel Core 2 Duo P8400, 3GB of ram, an ATI HD 34xx video card and a 16.4" screen all for $849. I ordered it on Sunday night and it was here on Wednesday, so far so good. It came with Vista 32 bit and I wanted to put Server 2008 64bit so I could run hyper-v. No problem I thought, I'll just wipe it and install from scratch. I even followed the instructions to create a recovery dvd so I could restore the laptop to it's factory state. So I got Server 2008 64bit installed, and went to go look for drivers, and here is where I realized I made a mistake in picking out this laptop. I assumed that Sony would have 64bit drivers for this model, well they didn't. I spent about 4 hours rounding up drivers and got just about everything working. Not a big deal I though, and it was my fault that I didn't check on the driver situation first. Went to fire up hyper-v and it said it couldn't start because the VT flag was disabled. No problem right? Just reboot, go into the BIOS and.....wow, this is the most bare bones bios I have EVER seen. I can change the boot order and that's it. Off to Google I went, and found out I was not alone. Sony disables the VT flag and does not give you an option to enable it. Some people have gotten creative and used a dos utility to edit the NVRAM directly, but the register you have to edit varies by model/bios. I think someone said it's listed in the fine print somewhere that the VT flag is disabled, but even if that's true, I'm still calling BS on this. I'm not going to mess around with the NVRAM on a brand new computer for something that shouldn't be disabled in the first place. Tomorrow I will be going to Best Buy to hopefully return the Sony and start my search once again. I really liked that P8400 processor, as it runs at 25w instead of 35w, which is what the T5800 runs at (the T5800 is the most common processor in the price range I was looking at). Given how much time I have spent researching, I think I might up my price to $1000 and hopefully save me some time. That should give me a few more options when looking for a laptop with a discrete video card as well.
|