Friday, November 30, 2007

Getting InfoPath attachments from a submitted form

This week I was not only busy with migrating old portals and solving problems but I was also busy with creating a console application that does the following :

  • Extract the attachments from a submitted InfoPath form and uploading those into a document library and return the links from the documents

Ofcourse this requirement is so generic that I had to be out there on our beloved world wide web ;) And luckily.. it was.. partly..! I found the following pieces of invaluable information: Upload an InfoPath attachment to a document library by Koen Roos and KB892730: How to encode and decode a file attachment programmatically by using Visual C# in InfoPath.

First things first.. what is Koen talking about in his post? Well he references another post that describes how you can generates classes out of your XML file. Since all submitted InfoPath forms are purely XML you can generate classes from it as well! So how does it work then?

  • Download a copy of a submitted form to your development machine
  • Run the Visual Studio Command line
  • Execute the following cmd : XSD "name of the submitted form"
  • Execute the following cmd : XSD "name of the created XSD file" /CLASSES
  • Open Visual Studio and open up your workflow project (see previous posts about how-to-do this)
  • Add the just created .cs file to your project
  • Then you can use code to get access to the values from the infopath fields in an OO way
System.Xml.Serialization.XmlSerializer xSerializer = new System.Xml.Serialization.XmlSerializer(typeof(myFields));
myFields res = (myFields)xSerializer.Deserialize(str);
Console.WriteLine(res.FirstName);

Where MyFields is the main datasource in my InfoPath form, so now when I want to access a particular field within my datasource I can use "res.AttachmentField" or "res.FirstName" to get the values. Now to get the binary data from the attached files I used the code from the KB article that can encode and decode the string and that will look like this :

InfoPathAttachmentDecoder dec = new InfoPathAttachmentDecoder(r.AttachmentField);

Now to put that back into a document library as a document we do the following

SPFolder AttachmentStore = web.GetFolder("Document Library");
AttachmentStore.Files.Add(dec.Filename, dec.DecodedAttachment);



To put it al together it will look like (so you can copy/paste it more conveniently ;))

SPSite site = new SPSite("http://portal/sites/subsite");
SPWeb web = site.OpenWeb();

SPFile file = web.GetFile(@"http://portal/sites/subsite/Document Library/form.xml");
System.IO.StreamReader str = new System.IO.StreamReader(file.OpenBinaryStream());
System.Xml.Serialization.XmlSerializer xSerializer = new System.Xml.Serialization.XmlSerializer(typeof(myFields));
myFields res = (myFields)xSerializer.Deserialize(str);

InfoPathAttachmentDecoder dec = new InfoPathAttachmentDecoder(res.AttachmentField);
SPFolder AttachmentStore = web.GetFolder("Document Library");
AttachmentStore.Files.Add(dec.Filename, dec.DecodedAttachment);

Now the next step is to make a custom workflow activity using this code.. but I will save that for another post ;)

 

Technorati tags:

File not Found errors after migrating a 2003 portal

During an (vanilla) upgrade of a 2003 portal, the upgrade process automatically turns every area and subarea into publishing webs. Sometimes the provisioning of this feature does not work as it should and therefore when you land on a page you automatically receive the File Not Found error.

 

 

So what should you do to solve this problem?

  • Well.. paste "/_layouts/settings.aspx" after the url of the web (eg http://portal/subsite/_layouts/settings.aspx).
  • Click on Site Features and there you will see that the Publishing feature isn't activated.
  • Activate the feature (to let it know that it is a publishing web so we can deactivate it)
     
  • Deactive the feature (let it remove all the previously provisioned bindings)
  • Activate the feature again (perform this operation to let it provision again freshly)

Problem solved!

 

Technorati tags: ,

Wednesday, November 28, 2007

The specified web does not contain a reporting metadata list.

I got this error on all our extranet sites when I opened up the Audit Log Reports within Site Settings

The specified web does not contain a reporting metadata list.   at Microsoft.Office.RecordsManagement.Internal.Utility.UniqueListManager.GetList(String strSaveName, SPWeb webSaveLocation, Boolean fThrowIfNotFound, Ids messageOnError) 
   at Microsoft.Office.RecordsManagement.Internal.Utility.UniqueListManager.GetList(String strSaveName, SPWeb webSaveLocation, Ids messageOnError) 
   at Microsoft.Office.RecordsManagement.Reporting.ReportingGallery.ReportingGalleryConstructor(SPWeb web) 
   at Microsoft.Office.RecordsManagement.Reporting.ReportingGallery..ctor(SPSite site) 
   at Microsoft.Office.RecordsManagement.Reporting.ApplicationPages.RunReports.OnLoad(EventArgs e) 
   at System.Web.UI.Control.LoadRecursive() 
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 

Now there a couple of things that these sites have in common :

  • they all have the same features activated
  • they have all been migrated from WSSv2 to WSSv3
  • they all are based on the Meeting Workspace template (MPS)

First thing I did was activating all sorts of MOSS features, both on sitecollection and site level. That did not work..
Second thing I did was creating a new sitecollection using the meeting workspace template and opened up the Audit Log Reports.. that did not work..
Thirdly I created a new sitecollection using the basic teamsite template and then opened up the Audit Log Reports.. and.. it worked!

So back to our intranet where hopefully we can reproduce the error we have :

  • migrated sites from WSSv2 to WSSv3
  • migrated and new sites based on the Meeting Workspace Template (MPS)
  • migrated and new sites based on the Basic Team Site (STS)

It failed for all the sites that used the MPS template and it worked for all the sites that used the STS template!

Googling the subject only returned results that the reporting feature was not properly provisioned for custom site templates:
Inside a Support Incident- SharePoint site templates and auditing, the quickfix he provides involves using STSADM to force the activation of the Reporting feature on the sitecollection. Unfortunately this does not fix our problem..

I will keep you posted about the solution!

Monday, November 26, 2007

Incoming E-mail functionality in Enterprise environments?

An user at the customer where I'm working at the moment asked the functional application manager of our SharePoint environment whether is was possible to enable the incoming e-mail functionality. So the question was dropped by me and I was going to investigate the matter.. I knew of the existence but never seen it live before so I googled on it and found the following useful information :

SharePoint 2007 - Incoming Email by Neil Thompson

Here's a snippet of Neil's post:

This is where I recommend you start, read all this stuff first, before you race off back to your Virtual Machines.

  1. Plan incoming e-mail (Office SharePoint Server)
  2. Configure incoming e-mail settings (Office SharePoint Server)
  3. In addition to the technet site, a very good place to start is
    1. How to configure email enabled lists in Moss2007 using Exchange 2003
    2. How to configure email enabled lists in Moss2007 using Exchange 2007
  4. Read these documents and set it up in a lab exactly as described until it works
  5. Now introduce incremental changes to the infrastructure and after each one, verify that email is still getting through, or not.

Following his advice I opened up the links and documentation and was horrified to find out that the first step in How to configure email enabled lists in Moss2007 using Exchange 2003 states "Let's get the Active Direcrory ready!". Now summing up that step I came to the following conclusion : if you want to make this work in an Exchange environment you've got to create a separate OU in AD. If my conclusion is right, it's no big deal for smaller companies where Active Directory isn't that big and some customizations can be made in an easy way and matter. But in my case, we are talking about an enterprise level customer..  Now there are several arguments why I dare not to ask the guys who administer AD to create an extra OU.

  • Farm level enabling or disabling the functionality (it's not a feature you can turn on or off on site (collection) level)
    • Given the fact we have more 600 site-collections (excluding sub-sites) you don't want to know the number of lists that could be e-mail enabled..
  • Wild growth in that particular OU we cannot manage (sizing, naming conventions, etc)
  • Wild growth in Outlook mailbox per user (forwarding rules from SharePoint to users and vice-versa)

So.. I must say it's really nifty feature.. unfortunately not very suitable in environments like these.. (or is there something I'm not aware of and I miss here?)

 

Technorati tags: ,

Friday, November 16, 2007

The life of a SharePointer is hard (sometimes)

This last week, Murphy paid me and my colleague a visit. During his visit he helped to bring down our extranet and our intranet environment. 

Extranet environment
On this environment all of a sudden we couldn't add users to Active Directory anymore. Also users could not change their password (using my excellent webpart) so I checked what was wrong with the server. It soon became clear that the particular server could not connect to the domain controller. The odd thing was that the domain controller was pingable so the two servers could see each other. When I pinged again a different IP address was returned.. so I pinged again and again and again.. to my surprise every time when I pinged I got a different IP address. The cause of this was a wrong setting in the DNS. The first address was of the proper virtual LAN and then address that was returned came from the 2nd virtual LAN that is only being used for backup procedures. So we asked the infra guys if they could fix this error since this 'glitch' since it was causing more problems as well. One more serious than the first I described like that the database server could not authenticate our service account. And we all know what happens if SharePoint cannot contact the database server..

As soon as that was fixed our intranet environment went down..

Intranet environment
After facing some performance issues we followed the guidelines by Joel for Application pools. And well.. just read the post at Sharepoint Application pool settings- update
Short conclusion : check REQUEST QUEUE LIMIT instead of uncheck the damn thing ;)

And then.. when all things were solved we got a call from support that our extranet environment could not accessed through the internet..

Sigh.. I guess it's love / hate thing :)

Friday, November 09, 2007

Want to use DPM?

Make sure that the servers you want to protect (in our case the SharePoint servers and database servers) have the following updates and patches applied to them :

SharePoint

Database

Also, run the DPM Server on a standalone server because DPM cannot protect itself as it can protect the other servers in your farm.

Want InfoPath forms with custom lookup dialogs?

Then check out Serve's PlugIt- Extend InfoPath browser form with custom lookup dialogs post (even featuring with a how-to movieclip!). This is some great news as I made a bet with him that this kind of customization was not possible and he'd proven me wrong ;) Now you can use custom webpages for looking up information and return those values into the fields on your form. You might wonder why you would want this.. imagine a dropdownlist on your form that is being populated from a webservice and returns more than 1000 items, this is not very user friendly now is it? So you create a custom webform where you can do some advanced searching/querying and return the result into the form :)

 

Technorati tags: , ,

Wednesday, November 07, 2007

Minor migration problems pt2

this is a follow up from Minor migration problems, in that post I described how to quickly address this error using the toolbar-flip technique. Now this is ofcourse not really an option if you have a lot sitecollections and subsites. So I decided to create a console application that checks every site and modifies the toolbar...

So my first idea was to programmatically  create the toolbar-flip technique. Googling I found a topic that covered just this thing : Update ListViewWebPart to Remove or Hide Toolbar ToolbarType= None. Reading through that thread and trying the samples that were given there, I managed to flip the toolbar from Summary to None to Full. Unfortunately only the setting of the toolbar was flipped, not on the webpart itself, so the link was not recreated. Bugger.. but I was on the right track :)

It became obvious to use the reflection technique in combination with the SPView that is associated with a ListViewWebPart (see the thread about the details). I became curious how SharePoint rendered the Toolbar string for the "Summary toolbar" using the new (and thus proper) way and the old way.

Old Way:

<HTML><![CDATA[ <table width=100% cellpadding=0 cellspacing=0 border=0 > 
<tr> <td colspan='2' class='ms-partline'><IMG SRC='/_layouts/images/blank.gif' 
width=1 height=1 alt=''></td> </tr> <tr> <td class='ms-addnew' 
style='padding-bottom: 3px'> <img src='/_layouts/images/rect.gif' alt=''>&nbsp;
<a class='ms-addnew' ID='idAddNewDoc' href=']]>
</HTML><URL Cmd='New' /><HTML>?RootFolder=</HTML><GetVar Name='RootFolder'
 URLEncode='TRUE' /><HTML><![CDATA[' ONCLICK='javascript:NewItem(']]>
</HTML><URL Cmd='New' /><HTML>?RootFolder=</HTML><GetVar Name='RootFolder' 
URLEncode='TRUE' /><HTML><![CDATA[', true);javascript:return false;' target='_self'>]]
></HTML><HTML>Add new document</HTML><HTML><![CDATA[</a> </td> </tr> 
<tr><td><IMG SRC='/_layouts/images/blank.gif' width=1 height=5 alt=''></td></tr> </table>]]></HTML>

New Way:

<IfHasRights><RightsChoices><RightsGroup PermAddListItems="required"
 /></RightsChoices><Then><HTML><![CDATA[ 
<table width=100% cellpadding=0 cellspacing=0 border=0 > <tr> 
<td colspan="2" class="ms-partline"><IMG SRC="/_layouts/images/blank.gif" 
width=1 height=1 alt=""></td> </tr> <tr> <td class="ms-addnew" 
style="padding-bottom: 3px"> <img src="/_layouts/images/rect.gif" alt="">
&nbsp;<a class="ms-addnew" ID="idAddNewDoc" href="]]></HTML>
<HttpVDir /><HTML><![CDATA[/_layouts/Upload.aspx?List=]]></HTML>
<ListProperty Select="Name" /><HTML><![CDATA[&RootFolder=]]>
</HTML><GetVar Name="RootFolder" URLEncode="TRUE" /><HTML>
<![CDATA[" ONCLICK="javascript:NewItem(']]></HTML><HttpVDir />
<HTML><![CDATA[/_layouts/Upload.aspx?List=]]></HTML>
<ListProperty Select="Name" /><HTML><![CDATA[&RootFolder=]]>
</HTML><GetVar Name="RootFolder" URLEncode="TRUE" />
<HTML><![CDATA[', true);javascript:return false;" target="_self">]]>
</HTML><HTML>Add new document</HTML><HTML>
<![CDATA[</a> </td> </tr> <tr><td>
<IMG SRC="/_layouts/images/blank.gif" width=1 height=5 alt="">
</td></tr> </table>]]></HTML></Then></IfHasRights>

Seeing this, it was pretty clear to just modify the Toolbar string from the SPView. Check the code below on how I did this :

static void Main(string[] args)
{
   SPWebApplication wa = SPWebApplication.Lookup(new Uri(@"http://webapplication"));
   //Loop through all the sitecollections within the webapplication
   foreach (SPSite site in wa.Sites)
   {
       //Loop through all the subsites within the sitecollection
       foreach (SPWeb web in site.AllWebs)
       {
           try
           {
               //Open up the default.aspx page to retrieve all the webparts
               SPLimitedWebPartManager WPColl = web.GetLimitedWebPartManager("default.aspx", System.Web.UI.WebControls.WebParts.PersonalizationScope.Shared);
               //Loop through every webpart in the collection
               foreach (Microsoft.SharePoint.WebPartPages.WebPart wp in WPColl.WebParts)
               {
                   if (wp is Microsoft.SharePoint.WebPartPages.ListViewWebPart)
                   {
                       //Extend the properties of the webpart using the ListViewWebPart class
                       ListViewWebPart ListViewWp = (ListViewWebPart)wp;

                       //Only change the properties if this is a document library since all the other webparts like Tasks, Links use other links (they use newform.aspx instead of upload.aspx)
                       if (web.Lists[new Guid(ListViewWp.ListName.ToString())].BaseTemplate == SPListTemplateType.DocumentLibrary)
                       {
                           try
                           {
                               //Got this piece of code from https://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1946546&SiteID=1&pageid=0 by Bruce VB and Eugen Lechner
                               System.Reflection.PropertyInfo ViewProp = ListViewWp.GetType().GetProperty("View", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
                               SPView spView = ViewProp.GetValue(ListViewWp, null) as SPView;

                               //The old and inproper links begin with the <HTML> bit first where as the proper link begins with <IfHasRights>
                               if (spView.Toolbar.StartsWith("<HTML>"))
                               {
                                   //I write out the url of the web and which document library for troubleshooting in case something does go wrong
                                   Console.WriteLine(web.Url.ToString());
                                   Console.WriteLine("Modifying: " + wp.Title.ToString());
                                   //The toolbar is being updated with the proper link
                                   spView.Toolbar = @"<IfHasRights><RightsChoices><RightsGroup PermAddListItems='required' /></RightsChoices><Then><HTML><![CDATA[ <table width=100% cellpadding=0 cellspacing=0 border=0 > <tr> <td colspan='2' class='ms-partline'><IMG SRC='/_layouts/images/blank.gif' width=1 height=1 alt=''></td> </tr> <tr> <td class='ms-addnew' style='padding-bottom: 3px'> <img src='/_layouts/images/rect.gif' alt=''>&nbsp;<a class='ms-addnew' ID='idAddNewDoc' href=']]></HTML><HttpVDir /><HTML><![CDATA[/_layouts/Upload.aspx?List=]]></HTML><ListProperty Select='Name' /><HTML><![CDATA[&RootFolder=]]></HTML><GetVar Name='RootFolder' URLEncode='TRUE' /><HTML><![CDATA[' ONCLICK='javascript:NewItem(']]></HTML><HttpVDir /><HTML><![CDATA[/_layouts/Upload.aspx?List=]]></HTML><ListProperty Select='Name' /><HTML><![CDATA[&RootFolder=]]></HTML><GetVar Name='RootFolder' URLEncode='TRUE' /><HTML><![CDATA[', true);javascript:return false;' target='_self'>]]></HTML><HTML>Add new document</HTML><HTML><![CDATA[</a> </td> </tr> <tr><td><IMG SRC='/_layouts/images/blank.gif' width=1 height=5 alt=''></td></tr> </table>]]></HTML></Then></IfHasRights>";
                                   spView.Update();
                               }

                           }
                           catch (Exception _error)
                           {
                               Console.WriteLine(_error.Message.ToString());
                           }
                       }

                   }
               }

               //If a meeting workspace is used, there is more than just 'default.aspx'. So we have to check the rest of the pages as well
               if (web.WebTemplate == "MPS")
               {
                   //The rest of the pages are kept in the "pages" folder
                   SPFolder srcFolder = web.Folders["pages"];
                   foreach (SPFile file in srcFolder.Files)
                   {
                       //Here we get the webparts from those specific pages
                       SPLimitedWebPartManager pagescollection = web.GetLimitedWebPartManager("pages/" + file.Name.ToString(), System.Web.UI.WebControls.WebParts.PersonalizationScope.Shared);
                       foreach (Microsoft.SharePoint.WebPartPages.WebPart _webpart in pagescollection.WebParts)
                       {
                           if (_webpart is Microsoft.SharePoint.WebPartPages.ListViewWebPart)
                           {
                               ListViewWebPart ListViewWp = (ListViewWebPart)_webpart;

                               if (web.Lists[new Guid(ListViewWp.ListName.ToString())].BaseTemplate == SPListTemplateType.DocumentLibrary)
                               {
                                   try
                                   {
                                       Guid webPartGuid = new Guid(((Microsoft.SharePoint.WebPartPages.ListViewWebPart)ListViewWp).ViewGuid);
                                       System.Reflection.PropertyInfo ViewProp = ListViewWp.GetType().GetProperty("View", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
                                       SPView spView = ViewProp.GetValue(ListViewWp, null) as SPView;

                                       if (spView.Toolbar.StartsWith("<HTML>"))
                                       {
                                           Console.WriteLine(web.Url.ToString());
                                           Console.WriteLine(file.Name.ToString());
                                           Console.WriteLine("Modifying: " + _webpart.Title.ToString());

                                           
                                           spView.Toolbar = @"<IfHasRights><RightsChoices><RightsGroup PermAddListItems='required' /></RightsChoices><Then><HTML><![CDATA[ <table width=100% cellpadding=0 cellspacing=0 border=0 > <tr> <td colspan='2' class='ms-partline'><IMG SRC='/_layouts/images/blank.gif' width=1 height=1 alt=''></td> </tr> <tr> <td class='ms-addnew' style='padding-bottom: 3px'> <img src='/_layouts/images/rect.gif' alt=''>&nbsp;<a class='ms-addnew' ID='idAddNewDoc' href=']]></HTML><HttpVDir /><HTML><![CDATA[/_layouts/Upload.aspx?List=]]></HTML><ListProperty Select='Name' /><HTML><![CDATA[&RootFolder=]]></HTML><GetVar Name='RootFolder' URLEncode='TRUE' /><HTML><![CDATA[' ONCLICK='javascript:NewItem(']]></HTML><HttpVDir /><HTML><![CDATA[/_layouts/Upload.aspx?List=]]></HTML><ListProperty Select='Name' /><HTML><![CDATA[&RootFolder=]]></HTML><GetVar Name='RootFolder' URLEncode='TRUE' /><HTML><![CDATA[', true);javascript:return false;' target='_self'>]]></HTML><HTML>Add new document</HTML><HTML><![CDATA[</a> </td> </tr> <tr><td><IMG SRC='/_layouts/images/blank.gif' width=1 height=5 alt=''></td></tr> </table>]]></HTML></Then></IfHasRights>";
                                           spView.Update();
                                       }

                                   }
                                   catch (Exception _error)
                                   {
                                       Console.WriteLine(_error.Message.ToString());
                                   }
                               }

                           }

                       }
                   }
               }
           }

           catch (Exception error)
           {
               Console.WriteLine(error.Message.ToString());
           }

           finally
           {
               web.Dispose();
               web.Close();
               site.Close();
               site.Dispose();
           }
       }
   }
}

So my thanks go out to Bruce VB and Eugen Lechner for guiding me in the right way ! :)

 

Technorati tags: , , ,

IM me via my blog ;)

If you want to ofcourse.. not that i'm pushing you to spam me to death with your kind words about how wonderful my blog is ;)

Ok to cut the crap.. I just read the last post by Mike Gannotti Include Instant Messaging Capabilities Within Your Blog where he links a document that covers the details how to implement this control Messenger IM Control & Presence and I just did. I can't believe how easy this is! There is a slight delay in the delivery of the messages but the overall this just kicks ass ;)

 

Technorati tags: ,

Tuesday, November 06, 2007

Overview of all the WSS/MOSS KB's

From Adir Ron comes this Huge list of MOSS/Office 2007 KB’s and Hotfixes.. go check it out if you run into some SharePoint problems that are identified by MS ;)

"..Premiering in this post, I present you a huge list of known KB's and Hot fixes for Office/MOSS 2007! I'll try and update this list any now and then and of course – if you came across issues that are not in this list, SHARE, SHARE, SHARE! .."

Technorati tags:

Minor migration problems

When you upgrade from 2003 to 2007 you sometimes miss some minor problems/issues that have occurred. Like the following issue that only takes place in our environment on migrated workspaces that are nested in sub sites. When you click on the "Add new document" on a listview webpart the path is not correct. All the documents are uploaded in the root of the document library and we all know that in workspaces there is always the /1 folder. So the uploaded documents are not visible but they are uploaded. If you check the URL of the "Add new document" link :

/Upload.aspx?RootFolder=
%2fsites%2fSite
%2fSubSite
%2fSubSubSite
%2fSubSubSubSubSite
%2fDocument%20Library13%2f1
?RootFolder=%2fsites%2fSite%2fSubSite%2fSubSubSite%2fSubSubSubSubSite%2fDocument%20Library4%2f1

Now when you click on "Modify Shared Webpart" > Change the Toolbar Type from Summary to Full > Click On Apply > Change it back to Summary > Click on Ok, the link looks like this :

/Upload.aspx?List={EA550280-20FA-4FD3-8C72-FDFA47B8D9C3}
&RootFolder=%2fsites%2fSite%2fSubSite%2fSubSubSite%2fSubSubSubSubSite%2fDocument%20Library4%2f1



Now that looks real different now doesn't it? :) I wonder why during migration this links remain unaffected. Btw. if you do "flip the toolbar"-technique you also fix the issue that sometimes when you click on the old "Add new document" link, you receive a WebPart error in the Upload page.

 

Technorati tags: ,

Monday, November 05, 2007

Make sure that all the paths are the same on each web front end

If you don't and you simply want to add an extra front-end server and for example on the first front-end server you put the virtual directories folder on the F drive. And the second web server does not have a F-drive you are confronted with all sorts of errors on the 2nd server when you open up a site:

Event Type:    Error
Event Source:    Windows SharePoint Services 3
Event Category:    Runtime 
Event ID:    6610
Date:        1-11-2007
Time:        9:44:34
User:        N/A
Computer:    2ndFrontEndServer
Description:
Safe mode did not start successfully. This page has encountered a critical error. Contact your system administrator if this problem persists.

For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.

And this error for each webpart that is on a page : "Web Part Error: This page has encountered a critical error".

Kinda freaky eh? :) I checked IIS to check whether all the necessary dll's were copied in the bin folder and checked the web.config to see if everything matched the first front-end server and.. it did! So what is causing this behavior? Next I tried adding a third server to determine that the 2nd server wasn't causing this problem and luckily enough the 3rd server was displaying the same behavior.  Then I tried to deploy a solution across the farm and while deploying an the following error was raised:

2ndFrontEndServer: http://portal/ : Portal 2007 : Error: The creation of this directory failed: f:\Inetpub\wwwroot\wss\VirtualDirectories\portal80\bin. 
Could not find a part of the path 'f:\Inetpub\wwwroot\wss\VirtualDirectories\portal80\bin'. 
2ndFrontEndServer : Could not find a part of the path 'f:\Inetpub\wwwroot\wss\VirtualDirectories\portal80\bin'. 

Very logical error since there is no F drive on the 2nd web server. And seeing this error made me realize that everything must be identical on both servers, so when I changed the driveletter on the 2nd webserver from E to F, everything worked like a charm. No more errors on the pages, no more errors in the eventviewer and no more errors when deploying a solution!

 

Technorati tags: ,