Showing posts with label SharePoint. Show all posts
Showing posts with label SharePoint. Show all posts

Thursday, April 13, 2017

Sample SOAP payload for a SharePoint Remote Event Receiver

This post is mostly about showing what an actual Remote Event Receiver message looks like but there are some of my musings too because if there's something I love more than coding it is ranting about minor annoyances with the tools we use for doing it. If you can't wait to see the actual sample - go straight ahead, it's waiting for you at the end. For the most patient ones - let the rant begin!

First, a bit of context - I've joined new team working on a super complex project and as a result they are not letting me anywhere near the actual code for a second month now. What do they have me do, then? What could be the most inconsequential thing for a noob to do that would still have them learn about the solution? You guessed right - unit tests! So I want to test a Remote Event Receiver (RER for short) and I though, well, surely there must be a sample SOAP message sent by a RER somewhere around teh interwebz. Disappointingly, if there is such a thing it is very well hidden as I couldn't find it and had to generate my own. It wasn't as simple as one might think so I'm sharing the fruit of this labour with the world.

Now is the time to rant a bit about the frustrations regarding SharePoint development. I've ranted before about how hard it is to find anything meaningful online because of the ubiquity of posts explaining trivial stuff. Seriously, who needs a million how-tos about adding a RER to an app? You just right-click on the project in Visual Studio and follow the wizard. One thing I haven't moaned about before though is the inept way Microsoft is presenting SharePoint app development. And no, I'm not even referring to the ham-fisted rebranding from "apps" to "add-ins", which left the community calling them "apps" while MS insist that they are "add-ins", in the same way that MS insisted for years that JavaScript is actually called EcmaScript.


What is SharePoint app development anyway?

If you try to teach yourself SharePoint 2013/2016 through online resources, or even if you attend a course or read a book they'll have you believe that before you even write a hello world app you need to understand about SharePoint-hosted vs Provider hosted, you need to know what's the app web and host web, the remote web app, etc. and before you even start coding you need to configure your farm for apps, which is decidedly non-trivial.

I'd say screw all this and don't confuse people with the complexities of deployed apps from day one - it's needlessly obscure and fails to drive home the main point of the SP 2013/2016 app architecture: from now on, you won't be writing applications that get deployed into SharePoint, you'll be building ASP.NET apps that talk to SharePoint through the client library.
That's what Microsoft doesn't want you to know and maybe even fail to admit it to themselves but seriously, does anyone actually build apps to be deployed through an app catalog? Almost all projects I've worked on lately involve writing code in an ASP.NET application that talks to SharePoint through the CSOM. Yeah, I get it, MS built all this app catalog infrastructure and now want to shove it down our throats so they keep talking about provider hosted and app web and whatnot when you just want to connect to SharePoint and update some files.

So, if there is a beginner SharePoint developer reading this - fear not, it's not as complicated as MS make it sound. Nowhere is this more obvious than when we bring Remote Event Receivers (RER) into the picture. If you go by MS sources alone you'll start pulling your hair in despair, expecting weeks of work just to get the damn thing to work - now you don't just have the usual moving parts and security config, you also have a service that needs yet another way to obtain a SharePoint context! Well, guess what - you don't need any of that - you just create your service that implements the correct contract, call a few lines of CSOM code to register your services as a RER and you're good to go; no apps, no app-only policy configuration, no nothing. Now is the time to give a big shout out to Dan Budimir, who went against the grain at MS and wrote a guide about this very thing:
https://blogs.msdn.microsoft.com/boodablog/2015/01/12/i-thought-i-needed-a-sharepoint-provider-hosted-app-for-that-part-1/


How do we capture the SOAP message?

When I came to be in need of a recorded SOAP payload from a RER my first thought was - hey, we already have this functionality in IIS through Failed Request Tracing, which can be used to record all traffic, including requests that didn't actually fail. However, it has a size limit and for most RER request bodies it actually cuts the ending. Therefore, Fiddler had to come to the rescue - here is the whole process if you want to capture some requests yourself:
If all this sounds too complicated (which it is) - just make use of the few that I prepared, you should be able to adapt them if they don't cover the event you need.
Below you'll find the full text dumps for ItemDeleted (the smallest one) and ItemUpdated and here are links for two more events:
ItemAdded
ItemFileMoved (that's the event that gets fired when you rename a file)


ItemDeleted

<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Body>
      <ProcessOneWayEvent xmlns="http://schemas.microsoft.com/sharepoint/remoteapp/">
         <properties xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
            <AppEventProperties i:nil="true" />
            <ContextToken />
            <CorrelationId>5bccd79d-32db-e06a-0000-077828386b67</CorrelationId>
            <CultureLCID>1033</CultureLCID>
            <EntityInstanceEventProperties i:nil="true" />
            <ErrorCode />
            <ErrorMessage />
            <EventType>ItemDeleted</EventType>
            <ItemEventProperties>
               <AfterProperties xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays" />
               <AfterUrl i:nil="true" />
               <BeforeProperties xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays" />
               <BeforeUrl>Docs/test11.txt</BeforeUrl>
               <CurrentUserId>22</CurrentUserId>
               <ExternalNotificationMessage i:nil="true" />
               <IsBackgroundSave>false</IsBackgroundSave>
               <ListId>6980e5dd-d847-4667-8792-1e2741d6cf18</ListId>
               <ListItemId>7</ListItemId>
               <ListTitle>Docs</ListTitle>
               <UserDisplayName>Kiryazov, S. (Stefan)</UserDisplayName>
               <UserLoginName>i:0#.w|europe\d-hy32co</UserLoginName>
               <Versionless>false</Versionless>
               <WebUrl>http://sharepoint.server/sites/sitecolurl</WebUrl>
            </ItemEventProperties>
            <ListEventProperties i:nil="true" />
            <SecurityEventProperties i:nil="true" />
            <UICultureLCID>1033</UICultureLCID>
            <WebEventProperties i:nil="true" />
         </properties>
      </ProcessOneWayEvent>
   </s:Body>
</s:Envelope>

ItemUpdated

<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Body>
    <ProcessOneWayEvent xmlns="http://schemas.microsoft.com/sharepoint/remoteapp/">
      <properties xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
        <AppEventProperties i:nil="true" />
        <ContextToken />
        <CorrelationId>00000000-0000-0000-0000-000000000000</CorrelationId>
        <CultureLCID>1033</CultureLCID>
        <EntityInstanceEventProperties i:nil="true" />
        <ErrorCode />
        <ErrorMessage />
        <EventType>ItemUpdated</EventType>
        <ItemEventProperties>
          <AfterProperties xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
            <a:KeyValueOfstringanyType>
              <a:Key>vti_folderitemcount</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:int">0</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_nexttolasttimemodified</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:dateTime">2017-02-01T08:30:41</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_candeleteversion</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:string">true</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_foldersubfolderitemcount</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:int">0</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_canmaybeedit</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:string">true</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>ContentTypeId</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:string">0x010100AE33CE7DE32F484490EEC317F89BE311</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_sourcecontrolcookie</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:string">fp_internal</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_filesize</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:int">1376</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_modifiedby</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:string">i:0#.w|domain\username</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_setuppathversion</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:int">15</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_level</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:int">1</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_timecreated</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:dateTime">2017-02-01T08:30:41</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_charset</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:string">utf-8</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_parserversion</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:string">15.0.0.4867</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_sourcecontrolversion</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:string">V1.0</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_author</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:string">i:0#.w|domain\username</a:Value>
            </a:KeyValueOfstringanyType>
          </AfterProperties>
          <AfterUrl>Docs/soap-list1.xml</AfterUrl>
          <BeforeProperties xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
            <a:KeyValueOfstringanyType>
              <a:Key>vti_metadatanextbsn</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:string">100</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_backgroundsave</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:int">0</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_replid</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:string">rid:{2824DA8B-7E05-4687-A6D3-E5293D4439FC}</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_level</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:int">1</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>ContentTypeId</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:string">0x010100AE33CE7DE32F484490EEC317F89BE311</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_setuppathversion</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:int">15</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_rtag</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:string">rt:2824DA8B-7E05-4687-A6D3-E5293D4439FC@00000000002</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_sourcecontrolversion</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:string">V1.0</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_sourcecontrolcookie</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:string">fp_internal</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_filesize</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:int">1376</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_modifiedby</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:string">i:0#.w|domain\username</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_metainfoversion</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:int">2</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_internalversion</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:int">513</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_nextbsn</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:string">162</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_parserversion</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:string">15.0.0.4867</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_docstoreversion</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:int">2</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_author</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:string">i:0#.w|domain\username</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_foldersubfolderitemcount</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:int">0</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_contentversionisdirty</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:string">false</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_timecreated</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:dateTime">2017-02-01T08:30:41</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_contenttag</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:string">{2824DA8B-7E05-4687-A6D3-E5293D4439FC},2,2</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_docstoretype</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:int">0</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_canmaybeedit</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:string">true</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_charset</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:string">utf-8</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_folderitemcount</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:int">0</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_timelastmodified</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:dateTime">2017-02-01T08:55:24</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_parentid</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:string">{733E0BCD-E0B4-45DA-8492-FDE35C98DD22}</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_candeleteversion</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:string">true</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_nexttolasttimemodified</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:dateTime">2017-02-01T08:30:41</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_contentversion</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:int">2</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_etag</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:string">"{2824DA8B-7E05-4687-A6D3-E5293D4439FC},2"</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_timelastwritten</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:dateTime">2017-02-01T08:55:24</a:Value>
            </a:KeyValueOfstringanyType>
            <a:KeyValueOfstringanyType>
              <a:Key>vti_streamschema</a:Key>
              <a:Value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:int">66</a:Value>
            </a:KeyValueOfstringanyType>
          </BeforeProperties>
          <BeforeUrl>Docs/soap-list1.xml</BeforeUrl>
          <CurrentUserId>22</CurrentUserId>
          <ExternalNotificationMessage i:nil="true" />
          <IsBackgroundSave>false</IsBackgroundSave>
          <ListId>6980e5dd-d847-4667-8792-1e2741d6cf18</ListId>
          <ListItemId>2</ListItemId>
          <ListTitle>Docs</ListTitle>
          <UserDisplayName>Kiryazov, S. (Stefan)</UserDisplayName>
          <UserLoginName>i:0#.w|europe\d-hy32co</UserLoginName>
          <Versionless>false</Versionless>
          <WebUrl>http://sharepoint.server/sites/ipp-content-stef</WebUrl>
        </ItemEventProperties>
        <ListEventProperties i:nil="true" />
        <SecurityEventProperties i:nil="true" />
        <UICultureLCID>1033</UICultureLCID>
        <WebEventProperties i:nil="true" />
      </properties>
    </ProcessOneWayEvent>
  </s:Body>
</s:Envelope>


Tuesday, March 7, 2017

SaveBinaryDirect giving you HTTP 500? Fear not!

I managed to get my code to work on the Friday afternoon and opened my celebratory beer with this warm sense of accomplishment. Life was good. For a while. Monday quickly rolled around as it always does and I found myself looking at a broken application - not a great start of the week; the code gremlins had once again sabotaged my work. My call to SaveBinaryDirect was crashing and a bit of debugging revealed that SharePoint was returning HTTP 500 without any further details (System.Net.WebException: The remote server returned an error: (500) Internal Server Error). What could it be?

Spolier alert: the maximum number of minor versions was being exceeded.

Now let's enjoy the story of my troubleshooting efforts even though I spoiled it. Some stories are worth reading even if you know how they end.

First thing I tried was to upload a different file - no problem with that. Double-checked if the file was checked-out - it wasn't. It was time to dig in the ULS.

If you have verbose logging on CSOM calls are actually easy to troubleshoot, you can see all the log entries for a given request more or less in sequence and if you use UlsViewer, and I don't see why you wouldn't, you can filter for a specific request.

I compared the log entries for the successful and unsuccessful uploads and the only difference was these two lines:
SQL return value 154 as HR 0x8007009a.
Translated store error 0x8007009a to 0x00210088

Now that's positively cryptic and google was of little help. Fortunately, it downed on me to conduct another test before spending too much time on this - I tried to upload the file the regular way, with a FileCreationInformation and batching as opposed to SaveBinaryDirect. Much to my delight, this time SharePoint was kind enough to tell me exactly what it didn't like about my request:
Microsoft.SharePoint.Client.ServerException: Minor version limit exceeded.
You must first publish a major version before editing this document.

In my case the file was being uploaded every 5 minutes, which exhausted the maximum number of 511 minor versions in just about 42 hours, which may or may not have something to do with life, the universe and everything.

I did as advised and now my solution publishes a major version by checking out and back in. The major versions can go up to 400,000 which will give me more than 3 years with an update every 5 minutes - much better though still not ideal, I guess I'll have to timestamp the file in order to avoid all these issues.

I also simplified the story of forcing the major version which is not exactly trivial - one needs to take into account situations like the file being left checked out, both by the same user and by others. If you behave I'll give you the code for this, too.

Friday, September 21, 2012

InfoPath - The URN specified in the XML template file does not match the URN specified in the form

You cheeky developer you, been monkeying around with your XSN files, haven't you ;-)

There comes a time in every SharePoint developer's life when he has to deal with some InfoPath. That's often a frustrating experience - especially when inheriting a middle-sized to large project. InfoPath probably does what it's supposed to do well - and this is to provide static forms for users to fill. If you swerve from the road well travelled however and try to build something more custom some opportunities (as we call problems nowadays) are likely to emerge, which get aggravated by the limited resources on the more specific scenarios.

One of those specific cases is when you need to manage form templates on the fly, programmatically. That's not particularly hard - after all InfoPath form templates are just CAB files containing XML, so you can dynamically unwrap them, do the changes needed and then put them back together with MakeCab or similar tool. Still, the process is not that hard to botch, and this "The URN specified in the XML template file does not match the URN specified in the form" error is one of the possible outcomes of getting it wrong.

This one is kind of self-descriptive, although it might not be exactly intuitive for InfoPath newbies. See, the URN (Uniform Resource Name) something like an identifier for the form template and is referenced on two different places throughout the files that comprise the XSN package and naturally, it needs to be the same in both. So, if you are spewing InfoPath form templates on the fly, with different names, you need to take care to edit the URN in sync - otherwise you end up with this error. You can also leave these alone altogether and not edit them - I haven't noticed any adverse consequences so far.

First, in minifest.xsf:

<?xml version="1.0" encoding="UTF-8"?>
<!--
This file is automatically created and modified by Microsoft InfoPath.
Changes made to the file outside of InfoPath might be lost if the form template is modified in InfoPath.
-->
<xsf:xDocumentClass solutionFormatVersion="2.0.0.0" solutionVersion="1.0.0.46" productVersion="14.0.0" name="urn:schemas-microsoft-com:office:infopath:your_form_name:-myXSD-2011-02-09T17-25-42" xmlns:xsf="http://schemas.microsoft.com/office/infopath/2003/solutionDefinition" xmlns:xsf2="http://schemas.microsoft.com/office/infopath/2006/solutionDefinition/extensions" ...

Then, in template.xml:

<?xml version="1.0" encoding="UTF-8"?>

<?mso-infoPathSolution name="urn:schemas-microsoft-com:office:infopath:your_form_name:-myXSD-2011-02-09T17-25-42" solutionVersion="1.0.0.46" productVersion="14.0.0" PIVersion="1.0.0.0" ?>
<?mso-application progid="InfoPath.Document" versionProgid="InfoPath.Document.2"?>
<?mso-infoPath-file-attachment-present?>
<my:myFields ...