WSS 2003 on ASP.NET 2.0

WSS 2003 on ASP.NET 2.0

I got this error in my WSS site that I am trying to upgrade to ASP.NET 2.0.


Error 
This Windows SharePoint Services virtual server has not been configured for use with ASP.NET 2.0.50727.42. For more information, please refer to Knowledge Base article 894903 at http://go.microsoft.com/fwlink/?LinkId=42660.


The resulting link is indeed very informative about what changes are required in the web.config to support the new security features of ASP.NET 2.0.


However, the stsadm -upgrade syntax that is mentioned in the article didn’t work for me.  I made the changes to the web.config file manually and everything works fine now.



 

Routing All Failed Messages in BizTalk 2006

Routing All Failed Messages in BizTalk 2006

When I was at Tech Ed in Boston in June I spoke to Lee Graber (Developer Lead for the BiztTalk Core Engine) about how you would go about sending all routing failures (messages without subscribers) to a send port so that a copy is readily available.  He showed me a quick demo that was pretty cool.  Here are the steps to complete this simple demonstration:


1.  Create any old receive port, making sure you check “Enable Routing For Failed Messages” as below:




2.  Create a Send Port with a filter ErrorReport.FailureCode = “0xc0c01680” (this is the code for routing failures, like the ones you see in Event View and HAT that say “Can’t find a matching subscription for the message“)



Test it by dropping any old message (where there is no port or orchestration expecting a message of that type) on the receive port and watch it appear out the send port.

BizTalk 2006 SQL Adapter problem

Breaking News – July 29 2006 – Microsoft has released a supported hotfix for this issue but you must contact microsoft support services to obtain it.  The hotfix is supported but is not published on the support site because it has been classified as “confidential“. Refrence the KB article 918316  to obtain the fix


Applications that worked well under BTS 2004 may experience problems under BTS 2006 because of an apparent problem in the new SQL Adapter.   The error usually happens when you are expecting multiple rows/messages back from a SQL port.  The error looks something like the following.






Exception type: WrongBodyPartException
Source: Microsoft.XLANGs.BizTalk.Engine
Target Site: Void ReadMessageState(Microsoft.XLANGs.Core.Envelope, Microsoft.XLANGs.BaseTypes.XLANGMessage)
The following is a stack trace that identifies the location where the exception occured
   at Microsoft.BizTalk.XLANGs.BTXEngine.BTXXlangStore.ReadMessageState(Envelope env, XLANGMessage msg)
   at Microsoft.BizTalk.XLANGs.BTXEngine.BTXPortBase.ReceiveMessage(Int32 iOperation, Envelope env, XLANGMessage msg, Correlation[] initCorrelations, Context cxt, Segment s)
at CB.MMAHH_File.Orchestrations.CBHHDownloadStore.segment2(StopConditions stopOn)
at Microsoft.XLANGs.Core.SegmentScheduler.RunASegment(Segment s, StopConditions stopCond, Exception& exp)


There is a hotfix being developed for this issue, but it is currently (as of time of writing) in pre-release and you have to contact microsoft for it. The KB number to reference is 918316 (Which does not seem to show on the MS Site yet). The file name is 273599_ENU_i386_zip.exe.


I would just give you a link but that might do more harm than good becuase the hotfix is not fully tested.  If you desperately need it and MS just can’t seem to get it to you, contact me and I’ll see what I can do for you.

Processing Binary Documents Through BizTalk Via Web Services


Just finishing up a two-week BizTalk Proof of Concept where I demonstrated an easier way to manage B2B interactions between a large insurance company and their vendors. This post is focused on one part of the solution that accepts binary messages via web services, and uses BizTalk to extract the message and send to SharePoint.


Instead of using DIME or MTOM, this company exposes a web service where the vendor puts a binary blob into a web service message element. So how did I match this requirement? First, I started with the XML schema for the service interface. Instead of holding a binary node, my DocumentContent node holds a string (base64).


The most important step came next. How do you actually turn this string value back into a binary format to be consumed by BizTalk? I created a class (referencing Microsoft.XLANGs.BaseTypes) containing an implementation of the IStreamFactory interface. The class constructor takes in the base64 string and saves it into a member variable. Then, I implement the required CreateStream method which takes my value and returns a stream of bytes. CreateStream is used when inflating the message part to be sent to BizTalk. The entire class looks like this:

/// <summary>
/// Class which implements XLANG IStreamFactory and lets us define any content
/// to turn into a message. In this case, a string is converted back to binary format
/// and returned in the stream.
/// </summary>
public class MyStreamFactory : IStreamFactory
{
private string messageContent;

public MyStreamFactory(string inMessageContent)
{
messageContent = inMessageContent;
}
#region IStreamFactory Members
public System.IO.Stream CreateStream()
{
byte[] messageBytes = Convert.FromBase64String(messageContent);

return new System.IO.MemoryStream(messageBytes);
}

#endregion
}


The next step was to create an object called from my orchestration that would take this string in, and return the required XLANGMessage back. I created a simple method which takes the inbound string and creates an XLANGMessage using the StreamFactory created above. That class looks like this:

/// <summary>
/// Method to call to generate XLANG message
/// </summary>
public class MyMessageCreator
{
public void CreateMyMessage(XLANGMessage outMessage, string binaryStringMessage)
{
outMessage[0].LoadFrom(new MyStreamFactory(binaryStringMessage));
}
}
Note that I’m setting the first message part of outMessage and using the LoadFrom method.


Back in my orchestration, I have an atomic scope within which I include a variable of type MyMessageCreator. I created a message of type System.Xml.XmlDocument to hold the binary attachment. Remember that a message of this type can hold *anything* as long as you don’t try and validate it or do XPath on it. So this will be the message I pass into the CreateMyMessage method as the output parameter. The message assignment shape’s code looks like this:

//dummy content setup
VendorMessageDocument_Attach = VendorMessageDocument_Response;

messageCreator = new Customer.POC.FraudDetection.Helper.MyMessageCreator();
messageCreator.CreateMyMessage(VendorMessageDocument_Attach, VendorMessageDocument_Response.DocumentContent);

As you see from the top line, I had to set my “binary document” message equal to something else, just to instantiate it. That value will get overwritten by the subsequent call to CreateMyMessage.


So, after this part of the orchestration, I now have a valid BizTalk message with which to send to a port, which in my case, is a SharePoint library. What I haven’t shown yet is HOW to send this document to BizTalk the first place. I exposed this orchestration as a web service, first of all. After referencing this service from my ASP.NET page, I created an instance of the service class, the input document class, and went about taking the selected binary file (Word doc, PDF, Excel, whatever) and adding it to that document message. My code is as follows:

BinaryReader r = new BinaryReader(docUpload.FileContent);
byte[] docBytes = r.ReadBytes(Convert.ToInt32(r.BaseStream.Length));
string convertedText = Convert.ToBase64String(docBytes);
r.Close();
//add this now-formatted base64 string to the web service message payload
doc.DocumentContent = convertedText;

I submit that message, and we’re on our way! So as I’ve shown, you can accept random binary content within a message payload itself (sans attachment), create a valid BizTalk message which contains that binary content, and send it out. Sweet. Now I could easily enhance this by accepting binary content vs. strings, or doing the processing in a pipeline vs. the orchestration. Maybe later 😉


Technorati Tags: BizTalk

Regular expression for Time of day

I recently tried to validate a time input on an ASP.NET form and I didn’t manage to find a good regular expression on the net for the times I was trying to validate.  I call these “natural times” becaues it’s the way that most north americans write time. (12 hr clock, with : and whitespace separators). This won’t take UTC dates or 24 hr times that I know of but it works well (so far) with the .Tostring(”t”) short time representation of times.


((1+[012]+)|([123456789]{1}))(((:|\s)[0-5]+[0-9]+))?(\s)?((a|A|p|P)(m|M))


It seems longer than necessary (they always seem to), but it’s pretty forgiving for the user typing the time.I won’t take the time to explain all of the features of the expression but you can use the following links to help test it out.



  1. My favorite regular expression testing site.
  2. Regular expression reference site.

Regular expressions are one of those things that you run into often enough that you need to know them, but not often enough that you ever really get good at them.  So each time we struggle to get back in that mindset and then do some trial and error to get through the expression development.  I’m keeping this on my blog mostly for my own sake, so that I have it again when I need it. 


But feel free to lift it and give me feedback.